SuitNdtie

Hyperloop EXAM02

Mar 28th, 2019
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<queue>
  4. using namespace std;
  5.  
  6. struct inqueue{
  7.     int u;
  8.     int d;
  9.     vector<int> path;
  10.     bool operator <(const inqueue& rhs)const
  11.     {
  12.         return d > rhs.d;
  13.     }
  14. };
  15.  
  16. typedef struct{
  17.     int w;
  18.     int v;
  19. }edge;
  20.  
  21. int main()
  22. {
  23.     int n,m,siz;
  24.     scanf("%d %d %d",&n,&m,&siz);
  25.     int sour,dest;
  26.     scanf("%d %d",&sour,&dest);
  27.    
  28.     vector<edge> adj[n];
  29.     for(int i=0;i<m;i++){
  30.         int u,v,w;
  31.         scanf("%d %d %d",&u,&v,&w);
  32.         if(w > siz){
  33.             adj[u].push_back({w,v});
  34.             adj[v].push_back({w,u});
  35.         }
  36.     }
  37.    
  38.     priority_queue<inqueue> pq;
  39.     int dist[n];for(int i=0;i<n;i++)dist[i] = 2e9;
  40.     bool visited[n];for(int i=0;i<n;i++)visited[i] = false;
  41.     pq.push({sour,0,vector<int> ()});
  42.     dist[sour] = 0;
  43.     vector<int> anspath;
  44.     while(!pq.empty()){
  45.         int u = pq.top().u;
  46.         vector<int> tpath = pq.top().path;
  47.         pq.pop();
  48.         if(!visited[u]){
  49.             visited[u] = true;
  50.             tpath.push_back(u);
  51.            
  52.             if(u == dest){
  53.             //  anspath = tpath;
  54.                 for(int i=0;i<tpath.size();i++){
  55.                     anspath.push_back(tpath[i]);
  56.                 }
  57.             }
  58.             for(int i=0;i<adj[u].size();i++){
  59.                 int v = adj[u][i].v;
  60.                 int w = adj[u][i].w;
  61.                 if(!visited[v] && dist[u] + w < dist[v]){
  62.                     dist[v] = dist[u] + w;
  63.                     pq.push({v,dist[v],tpath});
  64.                 }
  65.             }
  66.         }
  67.     }
  68.     int q;
  69.     scanf("%d",&q);
  70.     if(q == 1){
  71.         if(dist[dest] == 2e9){
  72.             printf("-1");
  73.         }
  74.         else{
  75.             printf("%d",dist[dest]);   
  76.         }
  77.     }else{
  78.         if(dist[dest] == 2e9){
  79.             printf("-1");
  80.         }
  81.         else{
  82.             printf("%d\n",dist[dest]); 
  83.             printf("%d\n",anspath.size());
  84.             for(int i=0;i<anspath.size();i++){
  85.                 printf("%d ",anspath[i]);
  86.             }
  87.         }
  88.     }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment