Advertisement
splash365

dijstra_string

Nov 19th, 2020
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MAXN = 107;
  5. const int INF = INT_MAX;
  6.  
  7.  
  8. int N, E;
  9. int adj[MAXN][MAXN];
  10. bool vis[MAXN];
  11. int parent[MAXN];
  12. int dist[MAXN];
  13.  
  14. map<string, int> mark1;
  15. map<int, string> mark2;
  16.  
  17. void init()
  18. {
  19.     for(int i=0; i<MAXN; i++)
  20.     {
  21.         dist[i] = INF;
  22.         parent[i] = -1;
  23.     }
  24. }
  25.  
  26. struct Node
  27. {
  28.     int v, distance;
  29.     Node(int v, int distance)
  30.     {
  31.         this->v = v;
  32.         this->distance = distance;
  33.     }
  34. };
  35.  
  36. bool operator < (const Node &a, const Node &b)
  37. {
  38.     if(a.distance > b.distance) return true;
  39.     else return false;
  40. }
  41.  
  42.  
  43. void dijstra(int src)
  44. {
  45.     dist[src] = 0;
  46.     priority_queue<Node> pq;
  47.     pq.push(Node(src, dist[src]));
  48.  
  49.     while(pq.size() != 0)
  50.     {
  51.         int u = pq.top().v;
  52.         pq.pop();
  53.  
  54.         if(vis[u] == true) continue;
  55.  
  56.         vis[u] = true;
  57.  
  58.         for(int v = 1; v<=N; v++)
  59.         {
  60.             int cost = adj[u][v];
  61.             if(cost != 0)
  62.             {
  63.                 if(dist[u] + cost < dist[v])
  64.                 {
  65.                     dist[v] = dist[u] + cost;
  66.                     parent[v] = u;
  67.                     pq.push(Node(v, dist[v]));
  68.                 }
  69.             }
  70.         }
  71.     }
  72. }
  73.  
  74. void input()
  75. {
  76.     cin >> N >> E;
  77.     int id = 1;
  78.     for(int i = 0; i<E; i++)
  79.     {
  80.         string s1, s2;
  81.         int u, v, w;
  82.         cin >> s1 >> s2 >> w;
  83.         if(mark1[s1]==0)
  84.         {
  85.             mark1[s1] = id;
  86.             mark2[id] = s1;
  87.             id++;
  88.         }
  89.         if(mark1[s2]==0)
  90.         {
  91.             mark1[s2] = id;
  92.             mark2[id] = s2;
  93.             id++;
  94.         }
  95.         u = mark1[s1];
  96.         v = mark1[s2];
  97.         adj[u][v] = w;
  98.         adj[v][u] = w;
  99.     }
  100. }
  101.  
  102.  
  103. void PrintPath(int x)
  104. {
  105.     if(x == -1) return;
  106.     PrintPath(parent[x]);
  107.     cout << mark2[x] << " ";
  108. }
  109.  
  110. int main()
  111. {
  112.     freopen("input.txt","r",stdin);
  113.     freopen("output.txt","w",stdout);
  114.  
  115.     init();
  116.     input();
  117.  
  118.     dijstra(1);
  119.  
  120.     for(int i = 1; i<=N; ++i)
  121.     {
  122.         cout << "Node " << mark2[i] << ": " << endl;
  123.         cout << "Path : ";
  124.         PrintPath(i);
  125.         cout << "Distance : " << dist[i] << endl;
  126.         cout << endl;
  127.         cout << endl;
  128.     }
  129. }
  130.  
  131.  
  132.  
  133. /*
  134. input image: https://www.geeksforgeeks.org/wp-content/uploads/Fig-11.jpg
  135.  
  136. 9 14
  137. AA BB 4
  138. AA HH 8
  139. BB HH 11
  140. BB CC 8
  141. HH II 7
  142. HH GG 1
  143. CC II 2
  144. II GG 6
  145. CC DD 7
  146. CC FF 4
  147. GG FF 2
  148. DD FF 14
  149. DD EE 9
  150. FF EE 10
  151.  
  152. */
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement