SDUT 2144

 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。

Input

 输入包含多组数据,格式如下。

第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)

剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。

Output

 每组输出占一行,仅输出最小花费。

运行错误一次,数组大小应取决于边的数量。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define Maxn 10010
using namespace std;
struct edge
{
    int start,endn,weight;
} edges[Maxn];
char parent[Maxn];
int n,m;
int cmp(struct edge a,struct edge b)
{
    return a.weight<b.weight;
}
int Find(int x)
{
    int r,temp;
    for(r=x; parent[r]>=0; r=parent[r]);
    while(r!=x)
    {
        temp=x;
        x=parent[x];
        parent[temp]=r;
    }
    return r;
}
void merge(int A,int B)
{
    int a=Find(A),b=Find(B);
    int temp=parent[a]+parent[b];
    if(parent[a]>parent[b])
    {
        parent[a]=b;
        parent[b]=temp;
    }
    else
    {
        parent[b]=a;
        parent[a]=temp;
    }

}

void kruskal()
{
    int sumweight=0,d=0;
    for(int i=0; i<m;i++)
    {
        if(Find(edges[i].start)!=Find(edges[i].endn))
        {
            d++;
            sumweight+=edges[i].weight;
            merge(edges[i].start,edges[i].endn);
        }
    }
    if(d==n-1)
        printf("%d\n",sumweight);
    else
        printf("ERROR\n");
}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(parent,-1,sizeof(parent));
        for(int i=0; i<m; i++)
            scanf("%d%d%d",&edges[i].start,&edges[i].endn,&edges[i].weight);
        sort(edges,edges+m,cmp);
        kruskal();
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/coder-tcm/p/9193271.html