/* *State: HDU1599 46MS 340K 1460 B C++ *题目大意: * 杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条 * 旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1 * ,V2,....VK,V1,那么必须满足K>2,就是说至除了出发点以外至少要经过 * 2个其他不同的景区,而且不能重复经过同一个景区。现在8600需要你帮 * 他找一条这样的路线,并且花费越少越好。 *解题思路: * 巧妙利用floyd找最小环即可。注意中间的溢出问题。 */
View Code
#include <iostream> #include <cstdio> using namespace std; const int inf = 0x3f3f3f3f; const int MAXN = 105; int dis[MAXN][MAXN], g[MAXN][MAXN]; void init() { for(int i = 0; i < MAXN; i++) for(int j = 0; j < MAXN; j++) { if(i == j) dis[i][j] = g[i][j] = 0; else dis[i][j] = g[i][j] = inf; } } int floyd(int n) { int Min = inf; for(int k = 1; k <= n; k++) { for(int i = 1; i < k; i++) { if(g[i][k] == inf) continue; for(int j = i + 1; j < k; j++) { if(dis[i][j] != inf && g[k][j] != inf && dis[i][j] + g[i][k] + g[k][j] < Min) { Min = dis[i][j] + g[i][k] + g[k][j]; } } } for(int i = 1; i <= n; i++) { if(dis[i][k] == inf) continue; for(int j = 1; j <= n; j++) { if(dis[k][j] != inf && dis[i][j] > dis[i][k] + dis[k][j]) dis[i][j] = dis[i][k] + dis[k][j]; } } } return Min; } int main(void) { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif //printf("%d\n%d\n", inf, inf + inf); //printf("%d\n", 0x7fffffff); int n, m; while(scanf("%d %d", &n, &m) == 2) { int u, v, w; init(); for(int i = 0; i < m; i++) { scanf("%d %d %d", &u, &v, &w); if(dis[u][v] > w) { dis[u][v] = dis[v][u] = w; g[u][v] = g[v][u] = w; } } int Min = floyd(n); if(Min >= inf) printf("It's impossible.\n"); else printf("%d\n", Min); } return 0; }