ann8497

Dijkastra set implementation

Aug 31st, 2019
959
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1. /*
  2. Dijkastra theorem
  3. */
  4.  
  5. #include<bits/stdc++.h>
  6. using namespace std;
  7.  
  8.  
  9. template<typename T>
  10. class Graph{
  11.  
  12.   public:
  13.     unordered_map< T , list < pair< T, int> > >mp;
  14.    
  15.     void addEdge(T u, T v, int dist, bool bidir = true){
  16.        
  17.         mp[u].push_back(make_pair(v,dist));
  18.         if(bidir)
  19.         mp[v].push_back(make_pair(u, dist));
  20.        
  21.     }
  22.     void printadjList(){
  23.        
  24.         for(auto i : mp){
  25.            
  26.             cout<<i.first<<"->";
  27.            
  28.             for(auto j : i.second){
  29.                
  30.                 cout<<j.first<<" "<<j.second<<" ";
  31.             }
  32.             cout<<endl;
  33.         }
  34.        
  35.     }
  36.     void dijkastra(T src){
  37.        
  38.         unordered_map<T,int>dist;
  39.        
  40.         for(auto j : mp){
  41.             dist[j.first] = INT_MAX;
  42.         }
  43.        
  44.         set< pair< int , T > > s;
  45.        
  46.         dist[src] = 0;
  47.         s.insert(make_pair(0,src));
  48.        
  49.         while(!s.empty()){
  50.            
  51.             auto p = *(s.begin());
  52.            
  53.             T node = p.second;
  54.             int nodeDist = p.first;
  55.            
  56.             s.erase(s.begin());
  57.            
  58.             for(auto childPair : mp[node]){
  59.                
  60.                 if(nodeDist + childPair.second  < dist[childPair.first]){
  61.                    
  62.                     T dest = childPair.first;
  63.                     auto f = s.find(make_pair(dist[dest], dest));
  64.                     if(f != s.end()){
  65.                         s.erase(f);
  66.                     }
  67.                     dist[dest] = nodeDist + childPair.second;
  68.                     s.insert(make_pair(dist[dest], dest));
  69.                 }
  70.                
  71.             }
  72.            
  73.         }
  74.         for(auto d: dist){
  75.         cout<<d.first<<" is located at a distance of "<<d.second<<endl;
  76.     }
  77.        
  78.     }
  79.    
  80.    
  81. };
  82.  
  83. int main(){
  84.    
  85.     Graph<int> g;
  86.     g.addEdge(1, 2, 1);
  87.     g.addEdge(1, 3, 4);
  88.     g.addEdge(2, 3, 1);
  89.     g.addEdge(3, 4, 2);
  90.     g.addEdge(1, 4, 7);
  91.    // g.printadjList();
  92.     g.dijkastra(1);
  93.    
  94.     return 0;
  95. }
Add Comment
Please, Sign In to add comment