题目:http://acm.hdu.edu.cn/showproblem.php?pid=1102
/************************************************************************/ /* hdu Constructing Roads 最小生成树 题目大意:在N个村子中已经存在部分存在连通,建最少长度的路使得所有的村子连通。 解题思路:已经连通的村子其中间的路径作为0,即修建的时候修建为0耗费,求这些节点的最小生成树。 */ /************************************************************************/ #include <cstdio> #include <iostream> #include <algorithm> using namespace std; const int N = 101; int map[N][N]; int mark[N]; int n,q,i,j; int Prim() { int sum = 0; int t = n; int min,k; memset(mark,0,sizeof(mark)); while(--t) { min = 10000; for (i = 2; i <= n; i++) { if(mark[i]!=1 && map[1][i] < min) { min = map[1][i]; k = i; } } mark[k] = 1; sum += min; for (j = 2; j <= n; j++) { if(mark[j]!=1 && map[k][j] < map[1][j]) { map[1][j] = map[k][j]; } } } return sum; } int main() { while(scanf("%d",&n)!=EOF) { for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { scanf("%d",&map[i][j]); } } scanf("%d",&q); while(q--) { scanf("%d%d",&i,&j); map[i][j] = 0; map[j][i] = 0; } printf("%d ",Prim()); } return 0; }