您的位置:首页 > 其它

sdut oj 2144 最小生成树

2013-06-29 16:44 204 查看
一开始用的是标记u,v的方法写的但是这样不能保证他们是否在同一颗树上,所以又用了并查集。。。。


题目描述

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


输入

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


输出

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


示例输入

3 2
1 2 1
1 3 1
1 0



示例输出

2
0


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int flag[100000];
int find (int x)
{
int x1 = x;
while(x1 != flag[x1])
{
x1 = flag[x1];
}
return x1;
}
bool change(int x, int y)
{
int x1,y1;
x1 = find (x);
y1 = find (y);
if(x1 != y1)
{
flag[x1] = y1;
return true;
}
else return false;
}
struct node
{
int u,v,w;
} edge[10005];
int cmp(const void *a,const void *b)
{
struct node *c=(struct node *)a;
struct node *d=(struct node *)b;
return c->w-d->w;
}
int main()
{
int n, m, i, count;
while(~scanf("%d %d",&n, &m))
{
for(i = 0; i <= m; i++)
flag[i] = i;
for(i = 0; i < m; i++)
scanf("%d %d %d",&edge[i].u, &edge[i].v, &edge[i].w);
qsort(edge, m, sizeof(struct node), cmp);
count = 0;
for(i = 0; i < m; i++)
{
if(change(edge[i].u,edge[i].v))
count += edge[i].w;
}
printf("%d\n",count);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM