您的位置:首页 > 其它

HDU 2066 一个人的旅行

2016-09-26 15:59 316 查看

一个人的旅行

多起点,多终点,再在其中找一个最短的,如果估算数据小的话可以多次求最短路,更好的还是用弗洛伊德算法,预先打表,对于后面的问题直接调用,节约时间。这道题基本上就是弗洛伊德算法的模板。注意输入可能有重复边。

#include<cstring>
#include<cstdio>
#include<algorithm>
#define M 0xfffffff
#define N 1002
using namespace std;
int n,m,j,i,k,l,s,d;
int a

,b

;

int main()
{
while(~scanf("%d%d%d",&m,&s,&d))
{
for(i=0; i<N; i++)
for(j=0; j<N; j++)
{
if(i!=j)
a[i][j]=M;
else
a[i][j]=0;
b[i][j]=j;
}

for(i=0; i<m; i++)
{
scanf("%d%d%d",&j,&k,&l);
if(l<a[j][k])
{
a[j][k]=l;
a[k][j]=l;
}
}

for(i=1; i<=N; i++)
{
for(j=1; j<=N; j++)
{
if(i==j)
continue;
if(a[i][j]>=M)
continue;
for(k=1; k<=N; k++)
{
if(a[j][k]>a[j][i]+a[i][k])
{
a[j][k]=a[j][i]+a[i][k];
b[j][k]=b[j][i];
}
}
}
}
int start
,end
;
int minm=M;
for(i=1; i<=s; i++)
scanf("%d",&start[i]);
for(i=1; i<=d; i++)
{
scanf("%d",&end[i]);
for(j=1; j<=s; j++)
{
if(a[start[j]][end[i]]<minm)
minm=a[start[j]][end[i]];
}
}
printf("%d\n",minm);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: