AlenAntonelli

PRIIIIIM

Jun 25th, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5.  
  6. struct arista {
  7.     int desde, hasta, costo;
  8.     arista (int a, int b, int k) : desde(a), hasta(b), costo(k) {}
  9. };
  10.  
  11. bool operator< (const arista &a, const arista &b)
  12. {
  13.     return a.costo > b.costo;
  14. }
  15.  
  16. struct grafo {
  17.     vector< vector<arista> > ady;
  18.     vector<bool> visit;
  19.     int n, m;
  20.    
  21.     void leer()
  22.     {
  23.         cin>>n>>m;
  24.        
  25.         ady.resize(n+1);
  26.         visit = vector<bool> (n+1, false);
  27.        
  28.         int a, b, k;
  29.         for (int i=0; i<m; i++)
  30.         {
  31.             cin>>a>>b>>k;
  32.             ady[a].push_back( arista(a,b,k) );
  33.             ady[b].push_back( arista(b,a,k) );
  34.         }
  35.     }
  36.    
  37.     vector<arista> Prim ()
  38.     {
  39.         vector<arista>  arbol;
  40.         priority_queue<arista> pq;
  41.        
  42.         visit[1] = true;
  43.         for(int i=0; i<ady[1].size(); i++)
  44.             pq.push( ady[1][i] );
  45.            
  46.         while(pq.size() && arbol.size()<n-1 )
  47.         {
  48.             arista a = pq.top();
  49.             pq.pop();
  50.            
  51.             int nodo = a.hasta;
  52.             if (visit[nodo])
  53.                 continue;
  54.                
  55.             visit[nodo] = true;
  56.             arbol.push_back( a );
  57.            
  58.             for(int i=0; i<ady[nodo].size(); i++)
  59.                 if (!visit[ady[nodo][i].hasta])
  60.                     pq.push( ady[nodo][i] );
  61.         }
  62.        
  63.         return arbol;
  64.     }
  65. };
  66.  
  67. int main()
  68. {
  69.     vector<arista> arbol;
  70.     grafo g;
  71.    
  72.     g.leer();
  73.     arbol = g.Prim();
  74.    
  75.     int peso = 0;
  76.     for(int i=0; i<arbol.size(); i++)
  77.     {
  78.         cout<<arbol[i].desde<<" "<<arbol[i].hasta<<" "<<arbol[i].costo<<endl;
  79.         peso+=arbol[i].costo;
  80.     }
  81.        
  82.    
  83.     cout<<peso;
  84.    
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment