这是一个多源路径问题,可以选择与草儿家相连的城市挨个作为源点,找出该源点到各个目的地的最短时间并选取时间最短的那个,最后再在从不同源点出发的最短时间中选出一个最小的,可以用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; }
hdu 2066 一个人的旅行
最新推荐文章于 2023-03-19 16:29:49 发布