题目:
http://acm.hdu.edu.cn/showproblem.php?pid=2680
一直在纠结时间相等时入队列的先后问题,突然发现自己二呀,路径相等的都会依次入队啊~~~
好了,说正事,最短路问题,用Dijkstra,注意几个地方:
1.这个问题可以倒过来想,从终点到这几个点中的最短距离。
2.路是有向的,如果倒过来想问题,那么路的方向也要倒过来。
eg: 输入1 2 5即从1到2的时间是5,那么如果倒过来考虑(以她朋友的家为起点),就要记录w[2][1]=5;
源代码:
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 const int INF=100000000; 7 int visit[1005],w[1005][1005],d[1005]; 8 int main() 9 {10 int n,m,s,ok,re,i,j,p,q,t,e;11 while(scanf("%d %d %d",&n,&m,&s)!=EOF){12 memset(visit,0,sizeof(visit));13 for(i=1;i<=n;i++)14 for(j=1;j<=n;j++){15 w[i][j]=INF;16 d[i]=(i==s?0:INF);17 }18 for(i=1;i<=m;i++){19 scanf("%d %d %d",&p,&q,&t);20 if(w[q][p]>t) w[q][p]=t;21 }22 queue que;23 que.push(s);24 visit[s]=1;25 while(!que.empty()){26 int min=INF;27 ok=0;28 int temp=que.front();29 que.pop();30 for(i=1;i<=n;i++){31 if(visit[i]==0&&i!=temp){32 if(d[i]>d[temp]+w[temp][i]){33 d[i]=d[temp]+w[temp][i];34 }35 if(d[i]