您的位置:首页 > 其它

HDU 2066 一个人的旅行(地杰斯特拉)

2012-07-02 19:05 363 查看
题目链接

在实训的间隙刷个题。。。裸地杰斯特拉。

#include <stdio.h>
#include <string.h>
#define N 10000000
int p[1001][1001];
int main()
{
int i,j,k,t,s,d,sv,ev,w,min,num,min2,max;
int a[1001],o[1001],key[1001];
int low[1001];
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
memset(key,0,sizeof(key));
memset(low,0,sizeof(low));
memset(o,0,sizeof(o));
for(i = 1;i <= 1000;i ++)
{
for(j = 1;j <= 1000;j ++)
p[i][j] = N;
p[i][i] = 0;
}
max = 0;
for(i = 1;i <= t;i ++)
{
scanf("%d%d%d",&sv,&ev,&w);
if(p[sv][ev] > w)
{
p[sv][ev] = w;
p[ev][sv] = w;
}
if(max < sv)
max = sv;
if(max < ev)
max = ev;
}
for(i = 1;i <= s;i ++)
scanf("%d",&a[i]);
for(i = 1;i <= d;i ++)
{
scanf("%d",&j);
key[j] = 1;
}
min2 = N;
for(k = 1;k <= s;k ++)
{
memset(o,0,sizeof(o));
for(i = 1;i <= max;i++)
low[i] = p[a[k]][i];
o[a[k]] = 1;
for(i = 1;;i ++)
{
min = N;
for(j = 1;j <= max;j ++)
{
if(min > low[j]&&!o[j])
{
min = low[j];
num = j;
}
}
o[num] = 1;
if(min == N)break;
for(j = 1;j <= max;j ++)
{
if(low[j] > min +p[num][j]&&!o[j])
low[j] = min + p[num][j];
}
}
for(j = 1;j <= max;j ++)
{
if(key[j])
{
if(min2 > low[j])
min2 = low[j];
}
}
}
printf("%d\n",min2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: