标签:
Description
Input
Output
Sample Input
9 A 2 B 12 I 25 B 3 C 10 H 40 I 8 C 2 D 18 G 55 D 1 E 44 E 2 F 60 G 38 F 0 G 1 H 35 H 1 I 35 3 A 2 B 10 C 40 B 1 C 20 0
Sample Output
216 30
题目大意:把各个岛屿看成一个点,求各个岛屿之间,权值最小的路径。(最小生成树)
对于数据,数据输入的第一行n代表岛屿的个数,当为0是结束程序,
接着n-1行开始时为这岛屿的编号,用大写字母表示,接着是一个整数m,
表示与该岛屿连接岛屿的个数,然后该行输入m对数据,
第二个数字表示要重修两岛屿之间桥所需要的时间,输出数据见样例及原题。
代码如下:
#include <iostream> #include <stdio.h> #include <string.h> #include <cstdlib> #include <algorithm> #include <cmath>a using namespace std; int p[27];//并查集,用于判断两个点是否直接或间接连通 struct per { int u,v,w; }map[80]; bool cmp(per a,per b) { return a.w<b.w; } int find(int x) { return x==p[x]?x:p[x]=find(p[x]); } int main() { int n; while (scanf("%d",&n),n) { int i,j; for(i=0;i<27;i++) p[i]=i; int k=0; for(i=0;i<n-1;i++)//构造边的信息 { char str; int m; cin>>str>>m; for(j=0;j<m;j++,k++) { char str2; int t; cin>>str2>>t; map[k].u=(str-‘A‘); map[k].v=(str2-‘A‘); map[k].w=t; } } sort(map,map+k,cmp);//将边从小到大排序 int ans=0;//结果 for(i=0;i<k;i++) { int x=find(map[i].u); int y=find(map[i].v); if(x!=y) {//如果两点不在同一连通分量里,则将两点连接,并存储该边 ans+=map[i].w; p[x]=y; } } printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/llfj/p/5714285.html