最近才发现最短路的算法实在是太多了,就比如对于这道题目,可以用Dijkstra和优先队列

Dijkstra又可以用多源做 和 反向图+单源的!

优先队列类似于这个Bellman-Ford;

至于什么神马spfa估计也是和这个优先队列差不多。。 

我一直都比较喜欢这个dijkstra,这次也是用这个来做的,直接用多源。。

题目意思大家都能看懂吧  ^_^

贴代码:

# include<stdio.h>
# include
<string.h>
# define PI
0xfffffff
int adj[1005][1005],low[1005],visit[1005];
int main()
{
int i,m,n,w,s,p,q,t,index,index1,min,x;
while(scanf("%d%d%d",&n,&m,&s)!=EOF)
{
memset(adj,
-1,sizeof(adj));
for(i=1;i<=m;i++)
{
scanf(
"%d%d%d",&p,&q,&t);
if(adj[p][q]==-1 || adj[p][q]>t) adj[p][q]=t;
}
scanf(
"%d",&w);
for(i=1;i<=n;i++)
{
visit[i]
=0;
low[i]
=PI;
}
for(i=1;i<=w;i++)
{
scanf(
"%d",&x);
low[x]
=0;
}
index
=x;
while(index!=s)
{
min
=PI;
visit[index]
=1;
for(i=1;i<=n;i++)
{
if(visit[i]==1) continue;
if(adj[index][i]==-1 && low[i]==PI) continue;
if(adj[index][i]!=-1)
{
if(low[i]==-1 || adj[index][i]+low[index]<low[i]) low[i]=adj[index][i]+low[index];
}
if(low[i]<min){min=low[i];index1=i;}
}
if(min==PI) break;
index
=index1;
}
if(low[s]==PI) printf("-1\n");
else printf("%d\n",low[s]);
}
return 0;
}
posted on 2011-03-22 22:15  奋斗青春  阅读(237)  评论(0编辑  收藏  举报