您的位置:首页 > 其它

hdu 2066 一个人的旅行

2014-04-09 10:04 190 查看
基本的最短路,,只不过为多源多汇,可以建立超级源点和终点。。。

具体思路为:

1、选取0为起点,并把所有的起点到0的点距离设为1;

2、选取最大值+1点为终点,并把所有的终点到此终点的距离设为1;

3、求0到最大值+1点为终点的最短路径。。。

附上代码:

#include<stdio.h>
#include<string.h>
int map[1002][1002];
int vis[1002];
int divs[1002];

int n;
int max(int a,int b)
{
return a>b?a:b;
}
void dij(int a)
{

for(int i=0; i<=n; i++)
divs[i]=map[0][i];
divs[0]=0;
vis[0]=1;
for(int i=1; i<=n; i++)
{
int min=0x7ffffff;
int t=-1;
for(int j=0; j<=n; j++)
if(!vis[j]&&divs[j]<min)
min=divs[j],t=j;
if(t==-1)
return ;
vis[t]=1;
for(int j=0; j<=n; j++)
if(!vis[j]&&divs[j]>map[t][j]+divs[t])
divs[j]=map[t][j]+divs[t];
}
}

int main()
{
int t,s,d;
while(~scanf("%d%d%d",&t,&s,&d))
{
memset(vis,0,sizeof(vis));
for(int i=0; i<1002; i++)
for(int j=0; j<1002; j++)
map[i][j]=0x7ffffff;
n=0;
for(int i=0; i<t; i++)
{
int a,b,time;
scanf("%d%d%d",&a,&b,&time);
if(map[a][b]>time)
map[a][b]=map[b][a]=time;
if(n<max(a,b))
n=max(a,b);
}
n++;
//printf("*%d\n",n);
int z;
for(int i=0; i<s; i++)
scanf("%d",&z),map[0][z]=map[z][0]=1;
for(int i=0; i<d; i++)
scanf("%d",&z),map[z]
=map
[z]=1;
dij(n);
printf("%d\n",divs
-2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: