hdu 2680 Choose the best route最短路。。

最近才发现最短路的算法实在是太多了,就比如对于这道题目,可以用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;
}

转载于:https://www.cnblogs.com/183zyz/archive/2011/03/22/1991912.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值