Problem Description
有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
Input
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
Output
每组输出占一行,仅输出最小花费。
Example Input
3 2
1 2 1
1 3 1
1 0
Example Output
2
0#include<stdio.h>
#include<string.h>
#define maxn 10005
struct 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;
}