题目链接
最小生成树 kruskal模板题
#include<cstdio> #include<queue> #include<algorithm> #define pai pair<int,int> #define rank rrank using namespace std; int T; int n,m,k; struct node { int a,b,v; }G[50004]; int cmp(node & A,node &B) { return A.v>B.v; } int fa[20004],rank[20004]; void init(int x) { for(int i=0;i<=x;i++) { fa[i]=i; rank[i]=0; } } int find(int x) { if(fa[x]==x) return x; else return fa[x]=find(fa[x]); } void unite(int x,int y) { int fax=find(x); int fay=find(y); if(fax==fay) return ; if(rank[fax]<rank[fay]) { fa[fax]=fay; } else { fa[fay]=fax; if(rank[fax]==rank[fay]) rank[fax]++; } } int same(int a,int b) { return find(a) ==find(b);//!!! find() } int Kruskal() { init(n+m+1); sort(G,G+k,cmp); int sum=0; int i=1; for(int j=0;j<k;j++) { node t=G[j]; if(!same(t.a,t.b)) { sum+=t.v; unite(t.a,t.b); } } return sum; } int main() { scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); for(int i=0;i<k;i++) { scanf("%d%d%d",&G[i].a,&G[i].b,&G[i].v); G[i].b+=n; } printf("%d\n",10000*(n+m)-Kruskal()); } return 0; }
Conscription 最小生成树
最新推荐文章于 2022-05-13 11:54:04 发布