一直在纠结时间相等时入队列的先后问题,突然发现自己二呀,路径相等的都会依次入队啊~~~
好了,说正事,最短路问题,用Dijkstra,注意几个地方:
1.这个问题可以倒过来想,从终点到这几个点中的最短距离。
2.路是有向的,如果倒过来想问题,那么路的方向也要倒过来。
eg: 输入1 2 5即从1到2的时间是5,那么如果倒过来考虑(以她朋友的家为起点),就要记录w[2][1]=5;
#include <iostream> #include<queue> #include<stdio.h> #include<cstring> using namespace std; const int INF=100000000; int visit[1005],w[1005][1005],d[1005]; int main() { int n,m,s,ok,re,i,j,p,q,t,e; while(scanf("%d %d %d",&n,&m,&s)!=EOF){ memset(visit,0,sizeof(visit)); for(i=1;i<=n;i++) for(j=1;j<=n;j++){ w[i][j]=INF; d[i]=(i==s?0:INF); } for(i=1;i<=m;i++){ scanf("%d %d %d",&p,&q,&t); if(w[q][p]>t) w[q][p]=t; } queue<int>que; que.push(s); visit[s]=1; while(!que.empty()){ int min=INF; ok=0; int temp=que.front(); que.pop(); for(i=1;i<=n;i++){ if(visit[i]==0&&i!=temp){ if(d[i]>d[temp]+w[temp][i]){ d[i]=d[temp]+w[temp][i]; } if(d[i]<min){ ok=1; re=i; min=d[i]; } } } if(ok==1){ que.push(re); visit[re]=1; } } int ans=INF; int choice; scanf("%d",&choice); for(i=1;i<=choice;i++){ scanf("%d",&e); if(d[e]<ans) ans=d[e]; } if(ans==INF) printf("-1\n"); else printf("%d\n",ans); } return 0; }