本文出自:http://blog.csdn.net/svitter转载请注明出处;
原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=1102
题意:有N个村庄,用1到N标号,现在你需要建路连接村庄,使得建的路最短。一开始告诉你村庄的个数,然后给你一个邻接矩阵,然后再给你个q,告诉你有多少条路已经修了,然后告诉你哪两个村庄的路修了。
题解:最小生成树水题一发。。小难点在于后面的已经建成的村庄路,存在路则设置路径为0即可。
#include <iostream> #include <stdio.h> #include <string.h> #define INF 0x1f1f1f1f using namespace std; int cost[110][110]; int low[110]; bool vis[110]; int n; int i, j; int prim() { memset(low, 0, sizeof(low)); memset(vis, 0, sizeof(vis)); int i, j, p; int min, res = 0; vis[1] = 1; for(i = 2; i <= n; i++) //low每个点到生成树的最小距离, vis表示一个点是否加入到生成树中 low[i] = cost[1][i]; for(i = 2; i <= n; i++) { min = INF, p = -1; for(j = 1; j <= n; j++) { if(0 == vis[j] && min > low[j]) { min = low[j]; p = j; } } //min == INF 说明找不到能够加入的点了,说明图是不连通的 if(min == INF) return -1; res += min; vis[p] = 1; for(j = 1; j <= n; j++) { if(0 == vis[j] && low[j] > cost[p][j]) { low[j] = cost[p][j]; } } }//end of i; return res; } void ace() { int i, j; int v1, v2; int q; while(cin >> n) { for(i = 1; i <= n; i++) { for(j = 1; j <= n; j++) { scanf("%d", &cost[i][j]); // input the map; } } cin >> q; for(i = 0; i < q; i++) { scanf("%d%d", &v1, &v2); cost[v1][v2] = 0; cost[v2][v1] = 0; } cout << prim() << endl; } } int main() { ace(); return 0; }
hdu1102 Constructing Roads 最小生成树,布布扣,bubuko.com
hdu1102 Constructing Roads 最小生成树
原文:http://blog.csdn.net/svitter/article/details/24289695