SuitNdtie

Royal Parade

May 25th, 2019
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<queue>
  4. using namespace std;
  5. typedef long long int ll;
  6. struct edge{
  7.     int v;
  8.     ll w;
  9.     bool operator < (const edge& rhs)const
  10.     {
  11.         return w > rhs.w;
  12.     }
  13. };
  14.  
  15. int main()
  16. {
  17.     int n,m;
  18.     scanf("%d %d",&n,&m);
  19.     vector<edge> adj[n+1];
  20.     for(int i = 0 ; i < m ; i ++){
  21.         int u,v;
  22.         ll w;
  23.         scanf("%d %d %lld",&u,&v,&w);
  24.         adj[u].push_back({v,w});
  25.         adj[v].push_back({u,w});
  26.     }
  27.     int a,b;
  28.     scanf("%d %d",&a,&b);
  29.     ll distA[n+1];
  30.     ll distB[n+1];
  31.     ll distC[n+1];
  32.     bool visitedA[n+1];
  33.     bool visitedB[n+1];
  34.     bool visitedC[n+1];
  35.     bool check[n+1];
  36.     for(int i = 0 ; i <= n ; i ++){
  37.         distA[i] = 1e18;
  38.         distB[i] = 1e18;
  39.         distC[i] = 1e18;
  40.         visitedA[i] = false;
  41.         visitedB[i] = false;
  42.         visitedC[i] = false;
  43.         check[i] = true;
  44.     }
  45.     priority_queue<edge> pq;
  46.     distA[a] = 0;
  47.     pq.push({a,distA[a]});
  48.    
  49.     while(!pq.empty()){
  50.         int u = pq.top().v;
  51.         pq.pop();
  52.         if(visitedA[u])continue;
  53.         visitedA[u] = true;
  54.        
  55.         for(int i = 0 ; i < adj[u].size() ; i ++){
  56.             int v = adj[u][i].v;
  57.             ll w = adj[u][i].w;
  58.             if(!visitedA[v] && distA[u] + w < distA[v]){
  59.                 distA[v] = distA[u] + w;
  60.                 pq.push({v,distA[v]});
  61.             }
  62.         }
  63.     }
  64. /*  printf("distA : ");
  65.     for(int i = 1 ; i <= n ; i ++){
  66.         printf("%lld ",distA[i]);
  67.     }
  68.     printf("\n");*/
  69.    
  70.    
  71.     distB[b] = 0;
  72.     pq.push({b,distB[b]});
  73.     while(!pq.empty()){
  74.         int u = pq.top().v;
  75.         pq.pop();
  76.     //  printf("Test dijstraB u #%d\n",u);
  77.         if(visitedB[u])continue;
  78.         visitedB[u] = true;
  79.        
  80.         for(int i = 0 ; i < adj[u].size() ; i ++){
  81.             int v = adj[u][i].v;
  82.             ll w = adj[u][i].w;
  83.             if(!visitedB[v] && distB[u] + w < distB[v]){
  84.                 distB[v] = distB[u] + w;
  85.                 pq.push({v,distB[v]});
  86.             }
  87.         }
  88.     }
  89.    
  90. /*  printf("distB : ");
  91.     for(int i = 1 ; i <= n ; i ++){
  92.         printf("%lld ",distB[i]);
  93.     }
  94.     printf("\n");*/
  95.    
  96.     for(int i = 1 ; i <= n ; i ++){
  97.         if(distA[i] + distB[i] == distA[b]){
  98.             check[i] = false;
  99.     //      printf("Test checked %d\n",i);
  100.         }
  101.     }
  102.     int c,d;
  103.     scanf("%d %d",&c,&d);
  104.    
  105.     distC[c] = 0;
  106.     pq.push({c,distC[c]});
  107.     while(!pq.empty()){
  108.         int u = pq.top().v;
  109.         pq.pop();
  110.         if(visitedC[u] || !check[u])continue;
  111.         visitedC[u] = true;
  112.        
  113.         for(int i = 0 ; i < adj[u].size() ; i ++){
  114.             int v = adj[u][i].v;
  115.             ll w = adj[u][i].w;
  116.             if(check[v] && !visitedC[v] && distC[u] + w < distC[v]){
  117.                 distC[v] = distC[u] + w;
  118.                 pq.push({v,distC[v]});
  119.             }
  120.         }
  121.     }
  122.     printf("%lld",(distC[d] == 1e18 ? -1 : distC[d]));
  123.     return 0;
  124. }
Add Comment
Please, Sign In to add comment