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("\n"); 149 if (ch) printf("%d\n",e.u);else printf("Ticket Not Used\n"); 150 printf("%d\n",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("\n"); 161 Dij1.init(n);Dij2.init(n); 162 read(); 163 solve(); 164 } 165 }
uva11374 dij单源最短路+枚举,布布扣,bubuko.com
原文:http://www.cnblogs.com/little-w/p/3587798.html