MarVin666

Untitled

Dec 17th, 2015
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <vector>
  6. #include <queue>
  7. #include <cstdio>
  8. #include <cstring>
  9.  
  10. #define stolica 1
  11. using namespace std;
  12.  
  13. typedef pair< int, int > pii;
  14.  
  15. const int MAX = 1000000;
  16. const int INF = 0x3f3f3f3f;
  17.  
  18. vector< pii > G[MAX];
  19. int d[MAX];
  20.  
  21. void dijkstra(int start)
  22. {
  23.     int u, v, i, c, w;
  24.     priority_queue< pii, vector< pii >, greater< pii > > Q;
  25.     memset(d, 0x3f, sizeof d);
  26.     Q.push(pii(0, start));
  27.     d[start] = 0;
  28.  
  29.     while(!Q.empty()) {
  30.         u = Q.top().second; // node
  31.         c = Q.top().first; // node cost so far
  32.         Q.pop(); // remove the top item.
  33.  
  34.         if(d[u] < c) continue;
  35.  
  36.         for(i = 0; i < G[u].size(); i++)
  37.             {
  38.                 v = G[u][i].first; // node
  39.                 w = G[u][i].second; // edge weight
  40.  
  41.                 if(d[v] > d[u] + w) {
  42.                     d[v] = d[u] + w;
  43.                     Q.push(pii(d[v], v));
  44.                 }
  45.             }
  46.     }
  47. }
  48.  
  49. main()
  50. {
  51. int ilosc_miast = 0; // N
  52. int ilosc_traktow = 0; // M
  53. int ilosc_potencjalnych_traktow = 0; // K
  54. int *d_org = new int[MAX];
  55.  
  56. ifstream dane;
  57. ofstream zapis("out.txt", ios::out);
  58. dane.open("in2.txt");                    //-------------------------  PLIK Z KTOREGO POBIERAMY DANE ----------------
  59.  
  60.     dane >> ilosc_miast;
  61.     dane >> ilosc_traktow;
  62.     dane >> ilosc_potencjalnych_traktow;
  63.  
  64.     int n, e;
  65.  
  66. n=ilosc_miast;
  67. e=ilosc_traktow;
  68. int *u = new int[MAX];
  69. int *v = new int[MAX];
  70. int *w = new int[MAX];
  71. int u_d[1001];
  72. int v_d[1001];
  73. int w_d[1001];
  74. int ile = 0;
  75.  
  76.         for(int i=0; i<e; i++)
  77.         {
  78.             dane >> u[i];
  79.             dane >> v[i];
  80.             dane >> w[i];
  81.         }
  82.         for(int i=0; i<ilosc_potencjalnych_traktow; i++)
  83.         {
  84.             dane >> u_d[i];
  85.             dane >> v_d[i];
  86.             dane >> w_d[i];
  87.         }
  88.         for(int i = 0; i < e; i++)
  89.             {
  90.             G[u[i]].push_back(pii(v[i], w[i]));
  91.             G[v[i]].push_back(pii(u[i], w[i]));
  92.             }
  93.        dijkstra(stolica);
  94.                 /*cout<<"Najkrotsze dlugosci drog od stolicy: \n";
  95.                     for(int i = 1; i <= n; i++) {
  96.                         if(i == stolica) continue;
  97.                         if(d[i] >= INF) cout<<"\t do miasta " << i <<" brak drogi\n";
  98.                         else cout<<"\t do miasta " << i <<" "<<d[i]<<endl;
  99.                     }*/
  100.         for(int i = 1; i <= n; i++)
  101.             {
  102.                 d_org[i]=d[i];
  103.             }
  104.  
  105.         for(int i = 0; i < ilosc_potencjalnych_traktow; i++)
  106.         {
  107.             for(int i = 1; i <= n; i++) G[i].clear();
  108.  
  109.             for(int i = 0; i < e; i++)
  110.                 {
  111.                     G[u[i]].push_back(pii(v[i], w[i]));
  112.                     G[v[i]].push_back(pii(u[i], w[i]));
  113.                 }
  114.  
  115.             G[u_d[i]].push_back(pii(v_d[i], w_d[i]));
  116.             G[v_d[i]].push_back(pii(u_d[i], w_d[i]));
  117.  
  118.             dijkstra(stolica);
  119.  
  120.             for(int i = 2; i <= n; i++)
  121.                 {
  122.                 if(d[i] >= INF);
  123.                 else if(d_org[i] > d[i]) ile++;
  124.                 }
  125.             cout<<ile<<endl;
  126.             zapis<<ile<<endl;
  127.             ile = 0;
  128.         }
  129. dane.close();
  130. return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment