HDU 1233----并查集与最小生成树Kru算法

HDU 1233   还是畅通工程 

#include<iostream>
#include<stdio.h>
#include<algorithm>
#define MAX 10003
#define M 101
using namespace std;
int father[M];
typedef struct
{
	int i,j,k;
}Node;
Node set[MAX];

int cmp(Node a,Node b)
{
	return a.k<b.k;
}

int find(int x)
{
	if(x!=father[x]) father[x]=find(father[x]);
	return father[x];
}

void UnionSet(int x,int y)
{
	x=find(x);
	y=find(y);
	if(x!=y) father[x]=y;
}

int main()
{
	int n;
	while(scanf("%d",&n)&& n)
	{
	int total=0;
	for(int m=1;m<=n*(n-1)/2;m++)
	scanf("%d%d%d",&(set[m].i),&(set[m].j),&(set[m].k));
	sort(set,set+n*(n-1)/2+1,cmp);
	for(int m=1;m<=n;m++)
	{
	father[m]=m;
	//v[m]=1;
	}
	int num=n;
	for(int m=1;m<=n*(n-1)/2;m++)
	{
	if(num==1) break;
	if(find(set[m].i)!=find(set[m].j)) 
	{
	UnionSet(set[m].i,set[m].j);
	num--;
	total+=set[m].k;
	}
	}
	printf("%d\n",total);
	}
	return 0;
}

 

posted @ 2014-04-23 18:13  zhoudan  阅读(150)  评论(0)    收藏  举报