您的位置:首页 > 其它

hdu 2066 一个人的旅行(最短路)

2014-06-30 17:56 441 查看
题目:

链接:点击打开链接

题意:

思路:

对每个起点调用dij算法后,每个终点的最短路长度都已经出来了。对于每个起点,从这些终点的最短路中选出最最短路就可以了。
然后在比较每个终点,即求得最小值。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 100000000

const int N = 2000;

int t,s,d;
int a,b,time;
int map

;
int from
,to
;
int dis
;

int dijkstra(int a)
{
int vis
;
int minn;
memset(vis,0,sizeof(vis));
for(int i=1; i<=N; i++)
{
dis[i] = map[a][i];
}
dis[a] = 0;
vis[a] = 1;
for(int i=1; i<N; i++)
{
int x;
minn = INF;
for(int y=1; y<N; y++)
{
if(!vis[y] && dis[y] < minn)
{
minn = dis[x=y];
}
}
vis[x] = 1;
if(minn == INF)
break;
for(int y=1; y<=N; y++)
{
if(!vis[y] && dis[y] > dis[x] + map[x][y])
dis[y] = dis[x] + map[x][y];
}
}
minn = INF;
for(int i=1; i<=d; i++)
{
if(minn > dis[to[i]])
{
minn = dis[to[i]];
}
}
return minn;
}

int main()
{
//freopen("input.txt","r",stdin);
while(scanf("%d%d%d",&t,&s,&d) != EOF)
{
for(int i=0; i<N; i++)
{
for(int j=0; j<=N; j++)
map[i][j] = INF;
}
for(int i=1; i<=t; i++)
{
scanf("%d%d%d",&a,&b,&time);
if(map[a][b] > time)
map[a][b] = map[b][a] = time;
}
for(int i=1; i<=s; i++)
scanf("%d",&from[i]);
for(int i=1; i<=d; i++)
scanf("%d",&to[i]);
int minTime = INF;
for(int i=1; i<=s; i++)
{
if(minTime > dijkstra(from[i]))
minTime = dijkstra(from[i]);
}
printf("%d\n",minTime);
}
return 0;
}


-----------------------------------------------------------

战斗,从不退缩;奋斗,永不停歇~~~~~~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: