图结构练习——最小生成树

来源:互联网 发布:《java开发实战经典》 编辑:程序博客网 时间:2024/06/06 17:27

Problem Description

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

Input

输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。

Output

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

Example Input

3 21 2 11 3 11 0

Example Output

20
#include<stdio.h>#include<string.h>#define maxn 10005struct node{    int u;    int v;    int w;}tu[maxn];void getmap(int m){    int i;    for(i=1;i<=m;i++)    {        scanf("%d%d%d",&tu[i].u,&tu[i].v,&tu[i].w);    }}void qqsort(int left,int right){    int i,j,mid;    struct node m;    i=left; j=right; mid=tu[i].w; m=tu[i];    if(i>=j)        return ;    while(i<j)    {        while(i<j&&tu[j].w>=mid)            j--;        tu[i]=tu[j];        while(i<j&&tu[i].w<=mid)            i++;        tu[j]=tu[i];    }    tu[i]=m;    qqsort(left,i-1);    qqsort(j+1,right);}int find (int father[],int e){    int f;    f=e;    while(father[f]>0)    {        f=father[f];    }    return f;}void kruskal(int m){    int father[maxn];    int i,u,v,sum=0;    for(i=1;i<=m;i++)    {        father[i]=0;    }    for(i=1;i<=m;i++)    {        u=find(father,tu[i].u);        v=find(father,tu[i].v);        if(u!=v)        {            father[u]=v;            sum+=tu[i].w;        }    }    printf("%d\n",sum);}int main(){    int n,m,u,v,w;    while(scanf("%d%d",&n,&m)!=EOF)    {        getmap(m);        qqsort(1,m);        kruskal(m);    }    return 0;}
 
0 0