您的位置:首页 > 其它

SDUT 2144 图结构练习——最小生成树(kruskal模版)

2012-06-13 15:05 323 查看
题目链接

真郁闷。。。模版题,由于自己SB错误,错了5 6 次。。。不过也有好处,加深对模版的理解了。。 kruskal 模版

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int o[101],sum,num;
struct edge//图的结构体
{
int sv,ev,w;//起始边,终边,权值。
};
struct edge p[10000];//必须开到大于(n*n-1)/2,否则必然RE。。。
int comp(const void *a,const void *b)
{
return (*(struct edge*)a).w > (*(struct edge*)b).w ?1:-1;
}
int find(int x)//并查集find函数
{
int a = x;
while(a != o[a])
{
a = o[a];
}
return a;
}
void merge(int x,int y,int w)//并查集merge函数
{
int x1,y1;
x1 = find(x);
y1 = find(y);
if(x1 != y1)
{
o[x1] = y1;
sum += w;
num ++;
}
}
int main()
{
int n,m,i;
while(scanf("%d%d",&n,&m)!=EOF)
{
sum = 0;
num = 1;
for(i = 1;i <= n;i ++)//初始化并查集。。(擦,这里都出错了)
o[i] = i;
for(i = 0;i <= m-1;i ++)
{
scanf("%d %d %d",&p[i].sv,&p[i].ev,&p[i].w);
}
qsort(p,m,sizeof(p[0]),comp);//调用结构体快排
for(i = 0;i <= m-1;i ++)
{
merge(p[i].sv,p[i].ev,p[i].w);
if(num == n) break;//终止条件,合并n-1次。
}
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: