标签:
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