您的位置:首页 > 其它

hdu 2066 一个人的旅行

2013-08-28 13:11 375 查看
这是一个多源路径问题,可以选择与草儿家相连的城市挨个作为源点,找出该源点到各个目的地的最短时间并选取时间最短的那个,最后再在从不同源点出发的最短时间中选出一个最小的,可以用Dijkstra来求解。#include <iostream>
#include <cstring>

using namespace std;

const int MAXN = 1005;
const int INF = 1000000;

int dist[MAXN];
int S[MAXN];
int nearby[MAXN];
int destination[MAXN];
int Edge[MAXN][MAXN];
int num,d,s;

int Dijkstra( int v0 )
{
int i,j,k;
for(i = 1; i <= num; ++i)
{
dist[i] = Edge[v0][i];
S[i] = 0;
}
S[v0] = 1, dist[v0] = 0;
for(i = 1; i <= num; ++i)
{
int min = INF;
int u = v0;
for(j = 1; j <= num; ++j)
{
if(!S[j] && dist[j] < min)
{
min = dist[j];
u = j;
}
}
if( min == INF )//如果剩余的顶点都不能与已选的顶点相通,那么就要跳出
break;
S[u] = 1;
for(k = 1 ; k <= num; ++k)
{
if(!S[k] && Edge[u][k] < INF && dist[k] > dist[u] + Edge[u][k])
dist[k] = dist[u] + Edge[u][k];
}
}
int min = INF;
for( i = 1; i <= d; ++i)//这就是选出从顶点v0出发到各个目的地所需的最短时间,从中选取最小的
{
if(dist[ destination[i] ] < min)
min = dist[ destination[i] ];
}
return min;
}

int main()
{
int i,j;
int T;
int a,b,t;
while( cin>>T>>s>>d && T && s && d )
{
num = 0;
for(i = 0; i < MAXN; ++i)
{
for(j = 0; j < MAXN; ++j)
Edge[i][j] = INF;
}

for(i = 1; i <= T; ++i)
{
cin>>a>>b>>t;
if(t < Edge[a][b])//由于a,b之间有多条路,记录一个时间最短的;
Edge[a][b] = Edge[b][a] = t;
num = a > num ? a : num;//num是记录顶点个数,当然此题顶点号最大的既是num的值
num = b > num? b : num;
}
for(i = 1; i <= s; ++i)
cin>>nearby[i];//与草儿家相连的城市
for(i = 1; i <= d; ++i)
cin>>destination[i];//目的的

int min = INF,temp = 0;

for(i = 1; i <= s; ++i)
{
temp = Dijkstra( nearby[i] );//由于 是多源路径所以要挨个搜,选取时间最短的
if(temp < min)
min = temp;
}
cout << min << endl;
}
return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: