uva11374 dij单源最短路+枚举

  1 //uva11374 dij单源最短路+枚举
  2 #include<iostream>
  3 #include<string.h>
  4 #include<stdio.h>
  5 #include<stdlib.h>
  6 #include<cmath>
  7 #include<algorithm>
  8 #include<queue>
  9 #include<stack>
 10 #include<set>
 11 #include<map>
 12 #define maxn 510
 13 #define INF 9999999
 14 using namespace std;
 15 
 16 struct Edge
 17 {
 18     int u,v,dis;
 19 };
 20 struct Node
 21 {
 22     int d,u;
 23     bool operator<(const Node &x)const{
 24         return d>x.d;
 25     }
 26 };
 27 struct Dijkstra
 28 {
 29     int n,m;
 30     vector<Edge>edge;
 31     vector<int>G[maxn];
 32     bool vis[maxn];
 33     int d[maxn],p[maxn];
 34 
 35     void init(int n)
 36     {
 37         this->n=n;
 38         edge.clear();
 39         for(int i=0;i<=n;i++) G[i].clear();
 40     }
 41 
 42     void add(int u,int v,int c){
 43         edge.push_back((Edge){u,v,c});
 44         m=edge.size();
 45         G[u].push_back(m-1);
 46     }
 47 
 48     void dij(int s)
 49     {
 50         memset(vis,0,sizeof(vis));
 51         for(int i=0;i<=n;i++) d[i]=INF;
 52         d[s]=0;
 53         priority_queue<Node>Q;
 54         Q.push((Node){0,s});
 55         while(!Q.empty()){
 56             Node x=Q.top();Q.pop();
 57             int u=x.u;
 58             if (vis[u]) continue;
 59             vis[u]=true;
 60             for(int i=0;i<G[u].size();i++)
 61             {
 62                 Edge &e=edge[G[u][i]];
 63                 if (d[e.v]>d[u]+e.dis){
 64                     d[e.v]=d[u]+e.dis;
 65                     p[e.v]=G[u][i];
 66                     Q.push((Node){d[e.v],e.v});
 67                 }
 68             }
 69         }
 70     }
 71 }Dij1,Dij2;
 72 
 73 int nextint(){int x;scanf("%d",&x);return x;}
 74 
 75 int  n,st,ed,m1,m2;
 76 
 77 void read()
 78 {
 79     m1=nextint();
 80     for(int i=0;i<m1;i++)
 81     {
 82         int u,v,c;
 83         u=nextint();v=nextint();c=nextint();
 84         Dij1.add(u,v,c);Dij2.add(u,v,c);
 85         Dij1.add(v,u,c);Dij2.add(v,u,c);
 86     }
 87     Dij1.dij(st);Dij2.dij(ed);
 88 }
 89 void solve()
 90 {
 91     int mind=Dij1.d[ed];
 92     bool ch=false;
 93     Edge e;
 94 
 95     int m2=nextint();
 96     for(int i=0;i<m2;i++)
 97     {
 98         int u,v,c;
 99         u=nextint();v=nextint();c=nextint();
100         if (Dij1.d[u]+c+Dij2.d[v]<mind){
101             mind=Dij1.d[u]+c+Dij2.d[v];
102             e=(Edge{u,v,c});
103             ch=true;
104         }
105         if (Dij1.d[v]+c+Dij2.d[u]<mind){
106             mind=Dij1.d[v]+c+Dij2.d[u];
107             e=(Edge{v,u,c});
108             ch=true;
109         }
110     }
111     vector<int>path,ans;
112     path.clear();ans.clear();
113     int u,v;
114     if (ch)
115     {
116         u=e.u;
117         while(u!=st)
118         {
119             path.push_back(u);
120             u=Dij1.edge[Dij1.p[u]].u;
121         }
122         path.push_back(st);
123         for(int i=path.size()-1;i>=0;i--) ans.push_back(path[i]);
124 
125         v=e.v;
126         while(v!=ed)
127         {
128             ans.push_back(v);
129             v=Dij2.edge[Dij2.p[v]].u;
130         }
131         ans.push_back(ed);
132     }
133     else{
134         v=st;
135         while(v!=ed)
136         {
137             ans.push_back(v);
138             v=Dij2.edge[Dij2.p[v]].u;
139         }
140         ans.push_back(ed);
141     }
142 
143     for(int i=0;i<ans.size();i++)
144     {
145         if (i>0) printf(" ");
146         printf("%d",ans[i]);
147     }
148     printf("
");
149     if (ch) printf("%d
",e.u);else printf("Ticket Not Used
");
150     printf("%d
",mind);
151 
152     return ;
153 }
154 int main()
155 {
156     int cas=0;
157     while(cin>>n>>st>>ed && n>0)
158     {
159         cas++;
160         if (cas>1) printf("
");
161         Dij1.init(n);Dij2.init(n);
162         read();
163         solve();
164     }
165 }
原文地址:https://www.cnblogs.com/little-w/p/3587798.html