Airport Express
题意:n个点,有m条普通路径,k条高速路径,但是k条只能选一条走。问从s到e最短时间。
如果选a-->b这条高速,那么s-->a和b--->e必然也要是最短路。
于是我们可以先用两次dijkstra预处理出s到各点的最短路和e到各点的最短路,然后枚举k条高速走哪条。
输出路径的时候,可以递归~
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int inf=0x3f3f3f3f; 4 const int maxv=1010; 5 const int maxe=1010; 6 7 struct Edge 8 { 9 int u,v,w; 10 int nex; 11 }e[maxe<<1]; 12 int head[maxv]; 13 int cnt=0; 14 void init() 15 { 16 memset(head,-1,sizeof(head)); 17 cnt=0; 18 } 19 void add(int u,int v,int w) 20 { 21 e[cnt].u=u; 22 e[cnt].v=v; 23 e[cnt].w=w; 24 e[cnt].nex=head[u]; 25 head[u]=cnt++; 26 } 27 28 typedef pair<int,int> PII; 29 int dis[maxv]; 30 int par[maxv]; 31 void dijkstra(int s) 32 { 33 priority_queue<PII,vector<PII>,greater<PII> > pq; 34 for(int i=0;i<maxv;i++) dis[i]=inf; 35 dis[s]=0; 36 pq.push(PII(0,s)); 37 while(!pq.empty()) 38 { 39 PII temp=pq.top(); 40 pq.pop(); 41 int u=temp.second; 42 if(dis[u]<temp.first) continue; 43 for(int i=head[u];i!=-1;i=e[i].nex) 44 { 45 if(dis[e[i].v]>dis[u]+e[i].w) 46 { 47 dis[e[i].v]=dis[u]+e[i].w; 48 par[e[i].v]=i; 49 pq.push(PII(dis[e[i].v],e[i].v)); 50 } 51 } 52 } 53 } 54 int n,ss,ee; 55 int ds[maxv],de[maxv]; 56 int p[maxv],p1[maxv]; 57 58 void print(int a) 59 { 60 if(a==ss) 61 { 62 printf("%d",a+1); 63 } 64 else 65 { 66 int x=p1[a]; 67 print(e[x].u); 68 printf(" %d",a+1); 69 } 70 return ; 71 } 72 73 int main() 74 { 75 int kase=0; 76 77 while(scanf("%d%d%d",&n,&ss,&ee)!=EOF&&n) 78 { 79 if(kase++) puts(""); 80 ss--;ee--; 81 init(); 82 int u,v,w; 83 int m; 84 scanf("%d",&m); 85 for(int i=0;i<m;i++) 86 { 87 scanf("%d%d%d",&u,&v,&w); 88 u--,v--; 89 add(u,v,w); 90 add(v,u,w); 91 } 92 dijkstra(ss); 93 for(int i=0;i<n;i++) {ds[i]=dis[i];p1[i]=par[i];} 94 pa[ss]=-1; 95 dijkstra(ee); 96 for(int i=0;i<n;i++) {de[i]=dis[i];p[i]=par[i];} 97 p[ee]=-1; 98 99 100 int ans1=ds[ee]; 101 int a=-1,b=-1; 102 int k; 103 scanf("%d",&k); 104 for(int i=0;i<k;i++) 105 { 106 scanf("%d%d%d",&u,&v,&w); 107 u--;v--; 108 if(ans1>ds[u]+w+de[v]) 109 { 110 ans1=ds[u]+w+de[v]; 111 a=u,b=v; 112 } 113 if(ans1>ds[v]+w+de[u]) 114 { 115 ans1=ds[v]+w+de[u]; 116 a=v,b=u; 117 } 118 } 119 120 int flag=0; 121 if(a==-1) 122 { 123 int x=ss; 124 while(x!=ee) 125 { 126 if(!flag){printf("%d",x+1);flag=1;} 127 else printf(" %d",x+1); 128 x=e[p[x]].u; 129 } 130 printf(" %d\n",ee+1); 131 printf("Ticket Not Used\n%d\n",ans1); 132 } 133 else 134 { 135 print(a); 136 int x=b; 137 while(x!=ee) 138 { 139 printf(" %d",x+1); 140 x=e[p[x]].u; 141 } 142 printf(" %d\n",ee+1); 143 printf("%d\n%d\n",a+1,ans1); 144 } 145 } 146 return 0; 147 }
时间: 2024-10-16 11:47:20