#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 ",10000*(n+m)-ans); } }
冒个泡表示还活着。。。
这题需要转换下思维,就成最大生成树问题了。