#include <stdio.h>
#include <string.h>
#define INF 99999999
int map[1001][1001];
int dis[1001],book[1001];
int start[1001],end[1001];
void dijkstra(int s, int n)
{
memset(book,0,sizeof(book));
int i,u,v,min,j;
for(i = 1; i <= n; ++i)
dis[i] = map[s][i];
book[s] = 1;
for(i = 1; i < n; ++i)
{
min = INF;
for(j = 1; j <= n; ++j)
if(book[j] == 0 && dis[j] < min)
{
min = dis[j];
u = j;
}
book[u] = 1;
for(v = 1; v <= n; ++v)
{
if(map[u][v] < INF && dis[v] > dis[u] + map[u][v])
dis[v] = dis[u] + map[u][v];
}
}
}
int main()
{
int t,s,d,i,j,maxn,a,b,time,result;
while(scanf("%d %d %d",&t,&s,&d) != EOF)
{
maxn = 0;
result = INF;
for(i = 1; i <= 1000; ++i)
for(j = 1; j <= 1000; ++j)
if(i == j) map[i][j] = 0;
else map[i][j] = INF;
for(i = 1; i <= t; ++i)
{
scanf("%d %d %d",&a,&b,&time);
if(time < map[a][b])//这一步很重要,我本来wa了,后来加了这个判断,就ac了
map[a][b] = map[b][a] = time;
maxn = maxn > a ? maxn:a;
maxn = maxn > b ? maxn:b;
}
for(i = 1; i <= s; ++i)
scanf("%d",&start[i]);
for(i = 1; i <= d; ++i)
scanf("%d",&end[i]);
for(i = 1; i <= s; ++i)
{
dijkstra(start[i],maxn);//找出起点到终点的最短路径
for(j = 1; j <= d; ++j)//找出各个最短路径中更短的那个
result = dis[end[j]] < result ? dis[end[j]] : result;
}
printf("%d\n",result);
}
return 0;
}
hdu 2066 一个人的旅行(dijkstra)
最新推荐文章于 2019-06-19 17:18:16 发布