http://acm.hdu.edu.cn/showproblem.php?pid=1233
题目描述:
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
输入:
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
输出:
对每个测试用例,在1行里输出最小的公路总长度。
计算最小生成树的带价,prim算法直接上
#include <stdio.h> #define MAX 101 #define INF 0x7fffffff #define START 1 typedef unsigned int UINT; UINT A[MAX][MAX]; int visited[MAX]; void init(UINT n){ UINT i,j; for(i = 0;i < n;i++){ visited[i + 1] = 0;//i+1之前写成了i,让我WA了好多次 for(j = 0;j < n;j++) A[i][j] = INF; } } int main(){ UINT N,n,i,j,min_j; UINT a,b,matrix; UINT min,min_sum; UINT tmp[MAX],cnt; while(scanf("%d",&N) && N){ init(N); n = N * (N - 1) >> 1; for(i = 1;i <= n;++i){ scanf("%d%d%d",&a,&b,&matrix); A[a][b] = A[b][a] = matrix; } visited[START] = 1; min_sum = 0; tmp[0] = START; cnt = 1; while(cnt < N){ min = INF; for(i = 0;i < cnt;i++){ for(j = 1;j <= N;j++){ if(!visited[j] && A[tmp[i]][j] < min){ min = A[tmp[i]][j]; min_j = j; } } } tmp[cnt] = min_j; cnt++; visited[min_j] = 1; min_sum = min_sum + min; } printf("%d\n",min_sum); } return 0; }