一直在纠结时间相等时入队列的先后问题,突然发现自己二呀,路径相等的都会依次入队啊~~~
好了,说正事,最短路问题,用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;
}