Advertisement
Guest User

Untitled

a guest
Apr 30th, 2015
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <queue>
  5. #include <climits>
  6. #include <algorithm>
  7. #define MAXN 1005
  8. using namespace std;
  9.  
  10. typedef pair<int,int> ii;
  11. typedef vector<ii> vi;
  12. vi G[MAXN];
  13. int N, M, dist[MAXN], prec[MAXN], minimo=INT_MAX;
  14. bool precU[MAXN], vis[MAXN];
  15.  
  16. int main(){
  17.     freopen("input.txt", "r", stdin);
  18.     freopen("output.txt", "w", stdout);
  19.  
  20.     cin >> N >> M;
  21.     for(int i=0, u, v, w; i<M; i++){
  22.         cin >> u >> v >> w;
  23.         G[u].push_back( make_pair(w, v) );
  24.         G[v].push_back( make_pair(w, u) );
  25.     }
  26.    
  27.     priority_queue< ii, vi, greater<ii> > Q;
  28.     fill_n(dist, N+1, INT_MAX);
  29.     fill_n(prec, N+1, N);
  30.     dist[0]=prec[0]=0;
  31.     for(int nd=1; nd<=N; nd++){ //trova il prossimo nodo da cui far partire Dijkstra
  32.         if(vis[nd]) continue;
  33.         dist[nd] = 0; //distanza iniziale a 0
  34.         Q.push( make_pair(0, nd) ); //inserisco il nodo di partenza nell'heap
  35.         prec[nd] = 0; //precedente iniziale a 0
  36.         while(!Q.empty()){
  37.             int u = Q.top().second; Q.pop(); //prendo il nodo da visitare
  38.             if(vis[u]) continue; //se l'ho già visitato salto al prossimo
  39.            
  40.             for(int i=0; i<G[u].size(); i++){ //vedo i nodi connessi ad "u"
  41.                 int v = G[u][i].second, w = G[u][i].first;
  42.                 if( vis[v] && v!=prec[u]){ //se ce n'è uno che è già visitato ma non è il predecessore, vedo se può essere un ciclo minimo
  43.                    
  44.                     //Trovo il predecessore comune
  45.                     fill_n(precU, N+1, false);
  46.                    
  47.                     int p = prec[u], d;
  48.                     while(p>0){
  49.                         precU[p]=true;
  50.                         p = prec[p];
  51.                     }
  52.                     p = v;
  53.                     while(p>0 && !precU[p])
  54.                         p = prec[p];
  55.                     //ora il predecessore comune sarà "p"
  56.                    
  57.                      //la lunghezza del ciclo sarà la DistanzaDaPadU + DistanzaDaPaV + ArcoDaUaV
  58.                     d = dist[u]-dist[p] + dist[v]-dist[p] + w;
  59.                    
  60.                     minimo = min(d, minimo);
  61.                 }
  62.    
  63.                 if( w+dist[u] < dist[v]){ //Classico controllo di Dijkstra
  64.                     dist[v] = w+dist[u];
  65.                     prec[v] = u;
  66.                     Q.push( make_pair(dist[v], v) );
  67.                 }
  68.             }
  69.    
  70.             vis[u] = true; //segno il nodo come visitato
  71.         }
  72.     }
  73.    
  74.     cout << minimo << "\n";
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement