#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cstring>
#include <string>
#include <cmath>
#define maxi 50000 + 10
#define maxn 20000 + 10
#define INF 0x3f3f3f3f
using namespace std;
struct edge{
int u,v,cost;
};
bool comp(const edge &a,const edge &b)
{
return a.cost < b.cost;
}
edge es[maxi];
int V,E,N,M,T;
int f[maxn];
void input()
{
for (int i = 0; i < E; i++)
{
scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].cost);
es[i].cost *= -1;
es[i].v += N;
}
}
void init()
{
for(int i = 0; i < V; i++)
f[i] = i;
return ;
}
int find(int x)
{
if (x==f[x]) return x;
else
return f[x] = find(f[x]);
}
void unit(int x,int y)
{
x = find(x);
y = find(y);
if(x == y) return;
else f[x] = y;
return ;
}
bool same(int x,int y)
{
x = find(x);
y = find(y);
if (x==y) return true;
else return false;
}
void solve()
{
int ans=0;
init();
input();
sort (es,es+E,comp);
for(int j = 0; j < E; j++)
{
if (!same(es[j].u,es[j].v))
{
ans += es[j].cost;
unit(es[j].u,es[j].v);
}
}
ans += V*(10000);
cout << ans << endl;
}
int main()
{
cin >> T;
while(T--)
{
cin >> N >> M >> E;
V = N + M;
solve();
}
return 0;
}
Kruskal——模板
最新推荐文章于 2022-07-03 12:19:38 发布