poj3723 MST好题 kruskal

时间:2023-03-09 09:49:25
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);
}
}

冒个泡表示还活着。。。

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