Advertisement
Guest User

Untitled

a guest
May 27th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. const int NB_MAX_NOEUDS = 1000;
  8. const int INFINI = 1000*1000*1000;
  9. const int INDEFINI = -INFINI;
  10.  
  11. struct arrete
  12. {
  13.     int idNoeudArrive;
  14.     int poidsArrete;
  15.    
  16.     arrete() {}
  17.     arrete(int idNoeudArrive, int poidsArrete) : idNoeudArrive(idNoeudArrive), poidsArrete(poidsArrete) {}
  18. };
  19.  
  20. struct noeud
  21. {
  22.     int idNoeud;
  23.     int dist;
  24.    
  25.     noeud() {}
  26.     noeud(int idNoeud, int dist) : idNoeud(idNoeud), dist(dist) {}     
  27.    
  28.     bool operator < (const noeud &autre) const
  29.     {
  30.         return dist < autre.dist;
  31.     }
  32. };
  33.  
  34. struct Distance
  35. {
  36.     int dist;
  37.     int idPere;
  38.    
  39.     Distance() {}
  40.     Distance(int dist, int idPere) : dist(dist), idPere(idPere) {}
  41. };
  42.  
  43. vector<arrete> voisinDuNoeud[NB_MAX_NOEUDS+2];
  44. priority_queue<noeud> noeudsAVisiter;
  45. Distance dist[NB_MAX_NOEUDS+2];
  46.  
  47. int nbNoeuds, nbArretes, noeudDepart, noeudArrive;
  48.  
  49. void initDist()
  50. {
  51.     for(int iCase = 0 ; iCase < NB_MAX_NOEUDS+2 ; iCase++)
  52.         dist[iCase].dist = INDEFINI;
  53. }
  54.  
  55. int main()
  56. {
  57.     scanf("%d%d%d%d", &nbNoeuds, &nbArretes, &noeudDepart, &noeudArrive);
  58.     initDist();
  59.     for(int iArrete = 0 ; iArrete < nbArretes ; iArrete++)
  60.     {
  61.         int noeud1, noeud2, poids;
  62.         scanf("%d%d%d", &noeud1, &noeud2, &poids);
  63.         voisinDuNoeud[noeud1].push_back(arrete(noeud2, poids));
  64.         voisinDuNoeud[noeud2].push_back(arrete(noeud1, poids));
  65.     }
  66.    
  67.     noeudsAVisiter.push(noeud(noeudDepart, 0));
  68.    
  69.     while(!noeudsAVisiter.empty())
  70.     {
  71.         int idNoeudEnCours = noeudsAVisiter.top().idNoeud;
  72.         int distNoeudEnCours = noeudsAVisiter.top().dist;
  73.        
  74.         if(dist[idNoeudEnCours].dist == INDEFINI)
  75.         {
  76.             dist[idNoeudEnCours].dist = distNoeudEnCours;
  77.             if(idNoeudEnCours == noeudDepart)
  78.                 dist[idNoeudEnCours].dist = 0;
  79.             for(int iVoisin = 0 ; iVoisin < voisinDuNoeud[idNoeudEnCours].size() ; iVoisin++)
  80.             noeudsAVisiter.push(noeud(voisinDuNoeud[idNoeudEnCours][iVoisin].idNoeudArrive, dist[idNoeudEnCours].dist+voisinDuNoeud[idNoeudEnCours][iVoisin].poidsArrete));
  81.             noeudsAVisiter.pop();                                                            
  82.         }
  83.         else
  84.             noeudsAVisiter.pop();
  85.        
  86.     }
  87.    
  88.     printf("%d\n", dist[noeudArrive].dist);
  89.    
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement