Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // logistyka.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <iostream>
- #include <locale>
- #include <iomanip>
- using namespace std;
- class Wierzcholek
- {
- public:
- int nr;
- int t_min;
- int t_max;
- int luz;
- Wierzcholek()
- {
- t_min = 0;
- t_max = 0;
- nr = -1;
- luz = 0;
- }
- void Wyswietl()
- {
- cout << "Numer : " << nr << endl;
- cout << "Min : " << t_min << endl;
- cout << "Max : " << t_max << endl;
- cout << "Luz : " << luz << endl;
- }
- void ObliczLuz()
- {
- luz = t_max - t_min;
- }
- };
- class CPM
- {
- public:
- int ile_w;//ilość wierzchołków
- int ile_k;//ilość krawędzi
- int tab[100][100];//['wiersze']['kolumny']
- Wierzcholek w[100];
- void init()
- {
- //Czyszczenie
- for(int i=0;i<100;i++)
- for(int j=0;j<100;j++)
- tab[i][j]=-1;
- //Interface
- cout << "Podaj ilość wierzchołków:\n";
- cin >> ile_w;
- cout << "Podaj ilość krawędzi:\n";
- cin >> ile_k;
- int tmp_p,tmp_k,tmp_t;
- for(int i=0;i<ile_k;i++)
- {
- cout << "Podaj numer wierzchołka początku krawędzi" << (i+1) << " :\n";
- cin >> tmp_p;
- cout << "Podaj numer wierzchołka końca krawędzi" << (i+1) << " :\n";
- cin >> tmp_k;
- cout << "Podaj czas pracy " << (i+1) << " :\n";
- cin >> tmp_t;
- /*
- switch(i)
- {
- case 0: tmp_p=1;tmp_k=2;tmp_t = 5;
- break;
- case 1: tmp_p=1;tmp_k=3;tmp_t = 4;
- break;
- case 2: tmp_p=1;tmp_k=4;tmp_t = 3;
- break;
- case 3: tmp_p=2;tmp_k=7;tmp_t = 2;
- break;
- case 4: tmp_p=3;tmp_k=2;tmp_t = 4;
- break;
- case 5: tmp_p=3;tmp_k=6;tmp_t = 3;
- break;
- case 6: tmp_p=3;tmp_k=4;tmp_t = 2;
- break;
- case 7: tmp_p=4;tmp_k=6;tmp_t = 4;
- break;
- case 8: tmp_p=4;tmp_k=5;tmp_t = 1;
- break;
- case 9: tmp_p=6;tmp_k=7;tmp_t = 1;
- break;
- case 10:tmp_p=5;tmp_k=7;tmp_t = 2;
- break;
- }
- */
- tab[tmp_p-1][tmp_k-1]=tmp_t;
- tmp_p=tmp_k=tmp_t=0;
- }
- Numeruj();
- //Wyswietl();
- Sortuj();
- MinTerminy();
- MaxTerminy();
- Luzy();
- Wyswietl();
- WyznaczSciezke();
- }
- void Przyklad()
- {
- //Czyszczenie
- for(int i=0;i<100;i++)
- for(int j=0;j<100;j++)
- tab[i][j]=-1;
- ile_w =7;
- ile_k = 11;
- int tmp_p,tmp_k,tmp_t;
- for(int i=0;i<ile_k;i++)
- {
- switch(i)
- {
- case 0: tmp_p=1;tmp_k=2;tmp_t = 5;
- break;
- case 1: tmp_p=1;tmp_k=3;tmp_t = 4;
- break;
- case 2: tmp_p=1;tmp_k=4;tmp_t = 3;
- break;
- case 3: tmp_p=2;tmp_k=7;tmp_t = 2;
- break;
- case 4: tmp_p=3;tmp_k=2;tmp_t = 4;
- break;
- case 5: tmp_p=3;tmp_k=6;tmp_t = 3;
- break;
- case 6: tmp_p=3;tmp_k=4;tmp_t = 2;
- break;
- case 7: tmp_p=4;tmp_k=6;tmp_t = 4;
- break;
- case 8: tmp_p=4;tmp_k=5;tmp_t = 1;
- break;
- case 9: tmp_p=6;tmp_k=7;tmp_t = 1;
- break;
- case 10:tmp_p=5;tmp_k=7;tmp_t = 2;
- break;
- }
- tab[tmp_p-1][tmp_k-1]=tmp_t;
- tmp_p=tmp_k=tmp_t=0;
- }
- Numeruj();
- //Wyswietl();
- Sortuj();
- MinTerminy();
- MaxTerminy();
- Luzy();
- //Wyswietl();
- WyznaczSciezke();
- }
- void Przyklad1()
- {
- //Czyszczenie
- for(int i=0;i<100;i++)
- for(int j=0;j<100;j++)
- tab[i][j]=-1;
- ile_w =11;
- ile_k = 17;
- int tmp_p,tmp_k,tmp_t;
- for(int i=0;i<ile_k;i++)
- {
- switch(i)
- {
- case 0:
- tmp_p=1;
- tmp_k=5;
- tmp_t=2;
- break;
- case 1:
- tmp_p=1;
- tmp_k=3;
- tmp_t=5;
- break;
- case 2:
- tmp_p=1;
- tmp_k=2;
- tmp_t=7;
- break;
- case 3:
- tmp_p=2;
- tmp_k=3;
- tmp_t=0;
- break;
- case 14:
- tmp_p=2;
- tmp_k=6;
- tmp_t=7;
- break;
- case 10:
- tmp_p=3;
- tmp_k=4;
- tmp_t=10;
- break;
- case 6:
- tmp_p=4;
- tmp_k=5;
- tmp_t=0;
- break;
- case 7:
- tmp_p=4;
- tmp_k=7;
- tmp_t=10;
- break;
- case 8:
- tmp_p=4;
- tmp_k=6;
- tmp_t=0;
- break;
- case 9:
- tmp_p=5;
- tmp_k=7;
- tmp_t=4;
- break;
- case 5:
- tmp_p=6;
- tmp_k=7;
- tmp_t=12;
- break;
- case 13:
- tmp_p=6;
- tmp_k=9;
- tmp_t=2;
- break;
- case 12:
- tmp_p=7;
- tmp_k=10;
- tmp_t=5;
- break;
- case 11:
- tmp_p=7;
- tmp_k=8;
- tmp_t=6;
- break;
- case 4:
- tmp_p=8;
- tmp_k=10;
- tmp_t=2;
- break;
- case 15:
- tmp_p=9;
- tmp_k=11;
- tmp_t=2;
- break;
- case 16:
- tmp_p=10;
- tmp_k=11;
- tmp_t=6;
- break;
- }
- tab[tmp_p-1][tmp_k-1]=tmp_t;
- tmp_p=tmp_k=tmp_t=0;
- }
- Numeruj();
- //Wyswietl();
- Sortuj();
- MinTerminy();
- MaxTerminy();
- Luzy();
- //Wyswietl();
- WyznaczSciezke();
- }
- void Numeruj() //Numerowanie wierzchołków grafu
- {
- bool ss=false;
- int tmp_tab[100][100];
- //Czyszczenie
- for(int i=0;i<100;i++)
- for(int j=0;j<100;j++)
- tmp_tab[i][j]=-1;
- //Kopiowanie
- for(int i=0;i<ile_w;i++)
- for(int j=0;j<ile_w;j++)
- tmp_tab[i][j]=tab[i][j];
- //Wyznaczam Pierwszy
- for(int k=0;k<ile_w;k++)
- {
- for(int i=0;i<ile_w;i++)
- {
- ss=false;
- for(int j=0;j<ile_w;j++)
- if(tmp_tab[j][i] != -1 || tmp_tab[j][i] == -2)
- ss=true;
- if(ss == false)
- {
- w[i].nr=k;
- for(int j=0;j<ile_w;j++)
- {
- if(tmp_tab[i][j] != -2)
- tmp_tab[i][j] = -1;
- }
- for(int j=0;j<ile_w;j++)
- {
- tmp_tab[j][i] = -2;
- }
- //cout << k << "-" << i << endl;
- break;
- }
- }
- }
- }
- void Sortuj() //Numerowanie wierzchołków grafu
- {
- int tmp_tab[100][100],id,tmp,changes[100];
- //Czyszczenie
- for(int i=0;i<100;i++)
- for(int j=0;j<100;j++)
- {
- tmp_tab[i][j]=-1;
- changes[i]=NULL;
- }
- //Kopiowanie
- for(int i=0;i<ile_w;i++)
- for(int j=0;j<ile_w;j++)
- tmp_tab[i][j]=tab[i][j];
- //Czyszczenie
- for(int i=0;i<100;i++)
- for(int j=0;j<100;j++)
- tab[i][j]=-1;
- //Sortuje
- for(int k=0;k<ile_w;k++)
- {
- if(k == 0)
- id=0;
- else
- {
- for(int i=0;i<ile_w;i++)
- if(w[i].nr == k)
- {
- id = i;
- break;
- }
- }
- //Zamiana miejsccami kolumn i wierszy
- for(int j=0;j<ile_w;j++)
- tab[k][j]=tmp_tab[id][j];
- if(k != id)
- {
- bool ch = false;
- for(int l=0;l<ile_w;l++)
- if(changes[l] == k || changes[l] == id)
- ch = true;
- //cout << k << '-' << id <<endl;
- w[id].nr = id;
- if(!ch)
- {
- for(int j=0;j<ile_w;j++)
- {
- tmp = tab[j][k];
- tab[j][k] = tab[j][id];
- tab[j][id] = tmp;
- }
- changes[k]=k;
- }
- }
- }
- }
- void MinTerminy()
- {
- int min[100],ile=0;
- //Czyszczenie
- for(int i=0;i<100;i++)
- min[i]=NULL;
- //Wyznaczam Pierwszy
- for(int k=1;k<ile_w;k++)
- {
- for(int i=0;i<ile_w;i++)
- if(tab[i][k] >= 0)
- {
- min[ile] = tab[i][k]+w[i].t_min;
- ile++;
- }
- if(ile < 2)
- {
- w[k].t_min = min[0];
- min[0] = 0;
- } else {
- for(int i=1;i<ile;i++)
- if(min[0] < min[i])
- min[0] = min[i];
- w[k].t_min = min[0];
- //Czyszczenie
- for(int i=0;i<100;i++)
- min[i]=NULL;
- }
- ile=0;
- //cout << k << "-" << w[k].nr << " -> " << w[k].t_min <<endl;
- }
- }
- void MaxTerminy()
- {
- int max[100],ile=0;
- //Czyszczenie
- for(int i=0;i<100;i++)
- max[i]=NULL;
- //Wyznaczam Pierwszy
- w[ile_w-1].t_max = w[ile_w-1].t_min;
- for(int k=ile_w-2;k>=0;k--)
- {
- for(int i=0;i<ile_w;i++)
- if(tab[k][i] >= 0)
- {
- max[ile] = w[i].t_max-tab[k][i];
- ile++;
- }
- if(ile < 2)
- {
- w[k].t_max = max[0];
- max[0] = 0;
- } else {
- for(int i=1;i<ile;i++)
- if(max[0] > max[i])
- max[0] = max[i];
- w[k].t_max = max[0];
- //Czyszczenie
- for(int i=0;i<100;i++)
- max[i]=NULL;
- }
- ile=0;
- //cout << k << "->" << w[k].t_max <<endl;
- }
- }
- void Luzy()
- {
- for(int i=0;i<ile_w;i++)
- w[i].ObliczLuz();
- }
- void WyznaczSciezke()
- {
- int wynik=0;
- for(int k=0;k<ile_w;k++)
- for(int i=0;i<ile_w;i++)
- {
- if(tab[k][i] >= 0)
- {
- wynik = w[i].t_max - w[k].t_min - tab[k][i];
- //cout << wynik << " " << endl;
- if(wynik == 0 && w[i].luz == 0)
- {
- cout << (k+1) << " -> ";
- if((k+2) == ile_w)
- cout << (k+2);
- }
- }
- wynik=0;
- }
- }
- void Wyswietl()
- {
- cout << endl;
- for(int i=0;i<ile_w;i++)
- {
- for(int j=0;j<ile_w;j++)
- {
- if(tab[i][j] >= 0)
- cout << setw(3) << tab[i][j];
- else
- cout << setw(3) << "-";
- }
- cout << endl;
- }
- for(int i=0;i<ile_w;i++)
- {
- w[i].Wyswietl();
- cout << endl;
- }
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- //Ustawienia kodowania polskich znaków
- locale myloc ("Polish");
- locale oldloc = locale::global (myloc);
- CPM *engine = new CPM();
- // engine->init();//Wpiszujesz z palca
- // engine->Przyklad();//Automat
- engine->Przyklad1();//Automat
- locale::global (oldloc);
- cin.ignore();
- cin.get();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment