Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.84 KB | None | 0 0
  1. #include <set>
  2. #include <utility>
  3. #include <vector>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. struct node;
  9.  
  10. struct edge
  11. {
  12.     int weight;
  13.     node* n;
  14.     bool operator ==(const edge& e) const{
  15.         return n == e.n;
  16.     }
  17.     edge(int w, node* nn) : weight(w), n(nn){}
  18. };
  19.  
  20. struct node
  21. {
  22.     int id;
  23.     int distance;
  24.     vector<edge*> edges;
  25.  
  26.     bool operator <(const node& n) const
  27.     {
  28.         if (distance == n.distance)
  29.         {
  30.             return id < n.id;
  31.         }
  32.         else
  33.         {
  34.             return distance < n.distance;
  35.         }
  36.     }
  37.    
  38.     void add(edge* e){
  39.         bool found = false;
  40.         for(int i=0; i<edges.size(); i++){
  41.             if(edges[i]->n == e->n){
  42.                 edges[i]->weight = min(edges[i]->weight, e->weight);
  43.                 found = true;
  44.                 break;
  45.             }
  46.         }
  47.        
  48.         if(!found)
  49.             edges.push_back(e);
  50.     }
  51.     bool operator ==(const node& n) const{
  52.         return id == n.id;
  53.        
  54.     }
  55.  
  56.     node(int _id, int _distance) : id(_id), distance(_distance)
  57.     {
  58.     }
  59. };
  60.  
  61. vector<int> Dijkstra(vector<node*> graph, node* source)
  62. {
  63.     vector<int> result(graph.size(), -1);
  64.     source->distance = 0;
  65.     set<node> s;
  66.     vector<bool> seen(graph.size(), false);
  67.  
  68.     for (int i = 0; i < source->edges.size(); i++)
  69.     {
  70.         seen[source->id] = true;
  71.         source->edges[i]->n->distance = source->edges[i]->weight;
  72.         s.insert(*source->edges[i]->n);
  73.     }
  74.  
  75.     while (!s.empty())
  76.     {
  77.         node n = *s.begin();
  78.         s.erase(s.begin());
  79.        
  80.         result[n.id] = n.distance;
  81.         seen[n.id] = true;
  82.  
  83.         for (int i = 0; i < n.edges.size(); i++)
  84.         {
  85.             if (!seen[n.edges[i]->n->id] && s.find(*n.edges[i]->n) != s.end())
  86.             {
  87.                 if (n.edges[i]->weight + n.distance < n.edges[i]->n->distance)
  88.                 {
  89.                     s.erase(*n.edges[i]->n);
  90.                     n.edges[i]->n->distance = n.edges[i]->weight + n.distance;
  91.                     s.insert(*n.edges[i]->n);
  92.                 }
  93.             }
  94.             else if (!seen[n.edges[i]->n->id])
  95.             {
  96.                 n.edges[i]->n->distance = n.edges[i]->weight + n.distance;
  97.                 s.insert(*n.edges[i]->n);
  98.             }
  99.         }
  100.     }
  101.  
  102.     return result;
  103. }
  104.  
  105. int main(){
  106.    
  107.     int t;
  108.     cin >> t;
  109.     for(int a0 = 0; a0<t; a0++){
  110.         int n, m;
  111.         cin >> n; cin >> m;
  112.         vector<node*> graph(n);
  113.         for(int i=0; i<n; i++){
  114.             graph[i] = new node(i, -1);
  115.         }
  116.      
  117.         for(int i=0; i<m; i++){
  118.             int from, to, distance;
  119.             cin >> from; cin >> to; cin >> distance;
  120.             graph[from-1]->add(new edge(distance, graph[to-1]));
  121.             graph[to-1]->add(new edge(distance, graph[from-1]));
  122.         }
  123.         int s;
  124.         cin >> s;
  125.        
  126.         vector<int> d = Dijkstra(graph, graph[s-1]);
  127.        
  128.         for(int i=0; i<d.size(); i++){
  129.             if(graph[s-1]->id == i)
  130.                 continue;
  131.             cout << d[i] << " ";
  132.         }
  133.        
  134.         cout << endl;
  135.     }
  136.     return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement