Problem地址 : http://acm.hdu.edu.cn/showproblem.php?pid=2066
这道题可以使用最短路解题,因此可以使用Dijstra算法。
因为存在几个与家相连的地方,假设这个地方叫A,那我们可以设想家到A的距离为0,那此题就变成从A到目的地,变成从家到目的地。因为A的数量是不定的,但家就只有一个,所以采用这种措施可以简化题目。
另外此题中提供的路径,比如A到B,是可以有多条的,因此,A到B之间需要采取最短的那条。
题目中给出了几个主人公想去的地方,仔细想一下或许可以想到,这几个地方中可能存在几个到达不了的地方,这些不能到达的地方的存在可能会影响我们的判断,因此需要注意。
#include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; const int MAXN = 1000 + 50; const int INF = 65535; const int HOME = 0; // 起点 int dis[MAXN][MAXN]; // 两点之间的距离 int path[MAXN]; // 家到任意一点的距离 int vis[ MAXN ]; // 是否访问了该点 int roads, T, S, D; // roads表示地点的最大编号 void ReadRoads() { memset( dis, -1, sizeof( dis ) ); roads = -INF; int a, b, s; while( T -- ) { scanf( "%d%d%d", &a, &b, &s ); if( dis[a][b]!=-1 && dis[a][b] < s ) { continue; } dis[a][b] = dis[b][a] = s; roads = roads > a ? roads : a; roads = roads > b ? roads : b; } while( S -- ) { scanf( "%d", &a ); dis[HOME][a] = dis[a][HOME] = 0; } } void Dijstra() { memset( vis, false, sizeof( vis ) ); memset( path, 0, sizeof( path ) ); vis[0] = true; queue <int> q; q.push( HOME ); int t, i; while( !q.empty() ) { t = q.front(); q.pop(); for( i=0; i<=roads; i++ ) { if( dis[ t ][ i ] != -1 ) { if( vis[i] ) { path[i] = path[t]+dis[t][i] < path[i] ? path[t]+dis[t][i] : path[i]; } else { path[i] = path[t] + dis[t][i]; vis[i] = true; q.push( i ); } } } } } int GetMin() { int minC = INF; int tmpPos; while( D-- ) { scanf( "%d", &tmpPos ); if( !vis[ tmpPos ] ) { // 存在不能到达的城市 continue; } minC = minC < path[tmpPos] ? minC : path[ tmpPos ]; } return minC; } int main() { while( scanf( "%d%d%d", &T, &S, &D ) != EOF ) { ReadRoads(); Dijkstra(); printf( "%d ", GetMin() ); } return 0; }