解题报告:有N个村庄,要在这N个村庄之间修路,要求修好路之后所有的村庄都能连通,输入一共有N*(N-1)/2个,即已知每一对村庄之间的距离。
此题个人觉得用普莱姆算法比较好,因为已知每两个村庄之间的距离,同时也是因为一开始用克鲁斯卡尔交了n遍都没过,改用普莱姆一次就过了。
1 #include<cstdio> 2 #include<cstring> 3 int map[105][105],visit[105]; 4 const int MAX = 0xffffff; 5 int main() { 6 int N,M,x,y,z; 7 while(scanf("%d",&N)&&N) { 8 M = N*(N-1)/2; 9 for(int i = 1;i<=M;++i) { 10 if(i<=N) 11 map[i][i] = MAX; 12 scanf("%d%d%d",&x,&y,&z); 13 map[x][y] = map[y][x] = z; 14 } 15 memset(visit,0,sizeof(visit)); 16 int tot = 0; 17 visit[1] = 1; 18 for(int i = 1;i<N;++i) { 19 int Min = MAX,l1,l2; 20 for(int j = 1;j<=N;++j) 21 if(!visit[j]) { 22 for(int k = 1;k<=N;++k) 23 if(visit[k]&&map[j][k]<Min) { 24 Min = map[j][k]; 25 l1 = j; 26 l2 = k; 27 } 28 } 29 tot += Min; 30 visit[l1] = visit[l2] = 1; 31 } 32 printf("%d ",tot); 33 } 34 return 0; 35 }