您的位置:首页 > 其它

hdu 2680 Choose the best route

2015-08-17 21:24 543 查看
本题链接:点击打开链接

本题大意:

输入n,m,s,代表标号为1--n,有m组数据,终点为s。每组数据输入两个点及权值。然后输入w,代表有w个起点,然后输入各起点。求起点到终点的最短时间。

解题思路:

本题也是最短路径问题。有多个起点,本题也是与hdu 一个人的旅行 采取相同的方法。另外选取一个点,将各起点据此点的距离记为0,并以此点最为起点。

具体请参考代码:

#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
int map[1010][1010];
int dis[1010];
int mark[1010];
int n;
void dijkstra()//dijkstra算法
{
memset(mark,0,sizeof(mark));
for(int i=1;i<=n;i++)
dis[i]=INF;
dis[0]=0;
for(int i=0;i<=n;i++)
{
int vir,min=INF;
for(int j=0;j<=n;j++)
if(!mark[j]&&dis[j]<min)
{
min=dis[j];
vir=j;
}
if(min==INF)	break;
mark[vir]=1;
for(int j=0;j<=n;j++)
if(!mark[j]&&dis[j]>dis[vir]+map[vir][j])
dis[j]=dis[vir]+map[vir][j];
}
}
int main()
{
int m,s,w,begin;
while(scanf("%d%d%d",&n,&m,&s)!=EOF)
{
for(int i=0;i<1010;i++)
for(int j=0;j<1010;j++)
map[i][j]=INF;
for(int i=0;i<m;i++)
{
int p,q,t;
scanf("%d%d%d",&p,&q,&t);
if(map[p][q]>t)
map[p][q]=t;
}
scanf("%d",&w);
for(int i=0;i<w;i++)//将各起点替换为一个起点
{
scanf("%d",&begin);
map[0][begin]=0;
}
dijkstra();
if(dis[s]==INF)
printf("-1\n");
else
printf("%d\n",dis[s]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: