poj3723 MST好题 kruskal

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define inf 10000000
#define MAXN 20000

struct Edge{
	int x,y,len;
}e[3*MAXN];
int n,m,r,ans;
int fa[MAXN];
int find(int x)
{
	if(x != fa[x])
		fa[x] = find(fa[x]);
	return fa[x];
}
bool cmp(Edge x,Edge y)
{
	return x.len>y.len;
}
void kruskal()
{
	for(int i=0;i<=n+m;i++)
		fa[i]=i;
	ans=0;
	sort(e,e+r,cmp);
	int f1,f2;
	for(int i=0;i<r;i++)
	{
		f1=find(e[i].x);
		f2=find(e[i].y+n);
		//cout<<e[i].x<<' '<<f1<<endl;
		if(f1!=f2)
		{
			fa[f1]=f2;
			ans+=e[i].len;

		}
	}
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{

		scanf("%d%d%d",&n,&m,&r);
		for(int i=0;i<r;i++)
		{
			scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].len);
		}
		kruskal();
		printf("%d\n",10000*(n+m)-ans);
	}
}

冒个泡表示还活着。。。

这题需要转换下思维,就成最大生成树问题了。


posted @ 2014-02-26 20:36  amourjun  阅读(126)  评论(0编辑  收藏  举报