Advertisement
MarcinSZ

ASDps3

Dec 17th, 2013
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. class Dijkstra
  5. {
  6.     public:
  7.     int**przed;//macierz incydencji dla pierwotnego układu dróg
  8.     int**po;//macierz incydencji po wstawieniu drogi
  9.     int**poten;//macierz zawierajaca informacje o kolejnych mozliwych drogach do wstawienia
  10.     int**dijkstra;//macierz wykonywania operacji algorytmu dijkstry
  11.     int **dlugosc;//wektor pokazujący wartosci dlugosci minimalnych drog
  12.     int miasta;
  13.     int trakty;
  14.     int dozb;
  15.     Dijkstra()
  16.     {
  17.        
  18.         //odczyt z pliku
  19.         cout<<"wczytuje dane z pliku"<<endl;
  20.         ifstream F;
  21.         F.open("in.txt");
  22.         //tworz dynamiczne macierze
  23.         F>>miasta;F>>trakty;F>>dozb;
  24.         //macierz dla algorytmu
  25.         dijkstra = new int *[miasta];
  26.         for(int i=0;i<miasta;i++)
  27.         {
  28.             dijkstra[i]= new int[miasta];
  29.         }
  30.         //wektory rozwiazan algorytmu
  31.         dlugosc = new int *[2];
  32.         for(int i=0;i<miasta;i++)
  33.         {
  34.             dlugosc[i]= new int[miasta];
  35.         }
  36.         //macierz dla dijkstry przed
  37.         przed = new int *[miasta];
  38.         for(int i=0;i<miasta;i++)
  39.         {
  40.             przed[i]= new int[miasta];
  41.         }
  42.         //macierz dla dijkstry po
  43.         po = new int *[miasta];
  44.         for(int i=0;i<miasta;i++)
  45.         {
  46.             po[i]= new int[miasta];
  47.         }
  48.         int temp=0;
  49.         int pocz=0;
  50.         int kon=0;
  51.         temp=trakty;
  52.         //macierz dla krawedzi potencjalnych do zbudowania,charakterystyka listowa
  53.         poten=new int *[3];
  54.         for (int j=0;j<3;j++)
  55.             {
  56.                 poten[j]=new int[trakty];
  57.             }
  58.         //wstepny brak krawedzi w grafie przed tzn.-1
  59.         for(int i=0;i<miasta;i++)
  60.         {
  61.             for(int j=0;j<miasta;j++)
  62.             {
  63.                 przed[i][j]=-1;
  64.                 cout<<przed[i][j];
  65.             }
  66.         }
  67.         //wierzchołki,nadpisanie na 0
  68.         for(int i=0;i<miasta;i++)
  69.         {
  70.             przed[i][i]=0;
  71.             cout<<"c";
  72.         }
  73.         for(int i=temp;i>0;i--)
  74.         {
  75.             F>>pocz;
  76.             F>>kon;
  77.             F>>przed[pocz-1][kon-1];
  78.             cout<<i<<" ";
  79.         }
  80.         cout<<"b";
  81.         //symetryzacja
  82.         for(int i=0;i<miasta;i++)
  83.         {
  84.             for(int j=0;j<miasta;j++)
  85.             {
  86.                 if(przed[i][j]!=0 && przed[i][j]!=-1)
  87.                 {
  88.                     przed[j][i]=przed[i][j];
  89.                 }
  90.             }
  91.         }
  92.         //skopiuj macierz przed na po
  93.         for(int i=0;i<miasta;i++)
  94.         {
  95.             for(int j=0;j<miasta;j++)
  96.             {
  97.                 po[i][j]=przed[i][j];
  98.             }
  99.         }
  100.         for(int i=0;i<trakty;i++)
  101.         {
  102.             cout<<i<<" ";
  103.             F>>poten[0][i];
  104.             F>>poten[1][i];
  105.             F>>poten[2][i];
  106.         }    
  107.         F.close();
  108.         //wyswietl zawartosc macierzy przed
  109.         cout<<"zawartosc macierzy przed"<<endl;
  110.         for(int i=0;i<miasta;i++)
  111.         {
  112.             for(int j=0;j<miasta;j++)
  113.             {
  114.                 cout<<przed[i][j]<<" ";
  115.             }
  116.             cout<<endl;
  117.         }
  118.         //wyswietl zawartosc macierzy po
  119.         cout<<"zawartosc macierzy po"<<endl;
  120.         for(int i=0;i<miasta;i++)
  121.         {
  122.             for(int j=0;j<miasta;j++)
  123.             {
  124.                 cout<<po[i][j]<<" ";
  125.             }
  126.             cout<<endl;
  127.         }
  128.         cout<<"zawartosc macierzy potencjalnej"<<endl;
  129.     }
  130.     void przywroc_po()
  131.     {
  132.         for(int i=0;i<miasta;i++)
  133.         {
  134.             for(int j=0;j<miasta;j++)
  135.             {
  136.                 po[i][j]=przed[i][j];
  137.             }
  138.         }
  139.     }
  140.     void wysw_po()
  141.     {
  142.         cout<<"nowa macierz po"<<endl<<endl;
  143.         for(int i=0;i<miasta;i++)
  144.         {
  145.             for(int j=0;j<miasta;j++)
  146.             {
  147.                 cout<<po[i][j]<<" ";
  148.             }
  149.             cout<<endl;
  150.         }
  151.     }
  152.     class Dixtra{
  153.         public:
  154.         int* odl;//odleglosci aktualne
  155.         int* pop;//poprawione odleglosci po odwiedzeniu kolejnego miasta
  156.         bool* odw;//miasta odwiedzone
  157.        
  158.     };
  159.     int* dixtra(int** odleglosci){
  160.         Dixtra dix;
  161.         dix.odl=new int[miasta];
  162.         dix.pop=new int[miasta];
  163.         dix.odw=new bool[miasta];
  164.             dix.odl[0]=0;
  165.             dix.pop[0]=0;
  166.             dix.odw[0]=true;
  167.         for(int i=1;i<miasta;i++)
  168.         {
  169.             dix.odl[i]=odleglosci[0][i];
  170.             dix.pop[i]=-1;
  171.             dix.odw[i]=false;
  172.         }
  173.         for(int i=1,min_odl,min_wie;i<miasta-1;i++)
  174.         {
  175.             min_odl =-1;
  176.             min_wie =-1;
  177.             bool znalazl_nieodwiedzone_miasto=false;
  178.             for(int j=0;j<miasta-1;j++){
  179.                 if(dix.odw[j]==false && dix.odl[j]!=-1){
  180.                     if(znalazl_nieodwiedzone_miasto){
  181.                         min_odl = dix.odl[j];
  182.                         min_wie = j;
  183.                     }
  184.                     else if(dix.odl[j]<min_odl){
  185.                         min_odl = dix.odl[j];
  186.                         min_wie = j;
  187.                     }
  188.                 }
  189.             }
  190.             if(min_wie==-1 || min_wie>miasta){
  191.                 continue;
  192.             }
  193.             for(int j=1;j<miasta-1;j++){
  194.                 if(odleglosci[min_wie][j]+dix.odl[min_wie]<dix.odl[j]){
  195.                     dix.pop[j]=odleglosci[min_wie][j]+dix.odl[min_wie];
  196.                 }
  197.                 else{
  198.                     dix.pop[j]=dix.odl[j];
  199.                 }
  200.             }
  201.             for(int j=1;j<miasta-1;j++){
  202.                 dix.odl[j]=dix.pop[j];
  203.             }
  204.             dix.odw[min_wie]=true;
  205.         }
  206.         return dix.odl;
  207.     }
  208.     void algorytm()
  209.     {
  210.         ofstream ofs("out.txt");
  211.         int suma;
  212.         int* odleglosci_przed = dixtra(przed);
  213.        
  214.         for(int t=0;t<trakty;t++){
  215.             suma=0;
  216.             for(int i=0;i<miasta;i++)
  217.             {
  218.                 for(int j=0;j<miasta;j++)
  219.                 {
  220.                     po[i][j]=przed[i][j];
  221.                 }
  222.             }
  223.             po[poten[0][t]][poten[1][t]]=poten[2][t];
  224.             po[poten[1][t]][poten[0][t]]=poten[2][t];
  225.             int* odleglosci_po = dixtra(po);
  226.             for(int i=0;i<miasta;i++)
  227.             {
  228.                 if(odleglosci_po<odleglosci_przed){
  229.                     suma++;
  230.                 }
  231.             }
  232.             ofs<<suma<<endl;
  233.            
  234.         }
  235.        
  236.         /*
  237.         int *dystans;//szukanie minimum
  238.         dystans = new int [miasta];
  239.         int *min;
  240.         min = new int [miasta];
  241.         przed[0][1];
  242.         suma = new int[miasta];
  243.         //rozpoczynamy od pierwszego wiersza macierzy incydencji
  244.         for(int i=0;i<miasta;i++)
  245.         {
  246.             dijkstra[0][i]=przed[0][i];
  247.             //dystans 1->1 =0
  248.             dijkstra[i][0]=0;
  249.         }
  250.         if(przed[i][]>0 && min
  251.         */
  252.     }
  253.    
  254.        
  255.    
  256.     ~Dijkstra()
  257.     {
  258.         cout<<"usuwam"<<endl;
  259.         delete [] przed;
  260.         cout<<"usunalem"<<endl;
  261.         delete [] po;
  262.         cout<<"usunieto"<<endl;
  263.         delete [] dijkstra;
  264.         cout<<"usunieto"<<endl;
  265.         delete [] dlugosc;
  266.         cout<<"usunieto"<<endl;
  267.     }
  268. };
  269. int main()
  270. {
  271.         Dijkstra a;
  272.         a.algorytm();
  273.         system("PAUSE");
  274.         return 0;
  275. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement