[poj3723] Conscription
Posted HLX_Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[poj3723] Conscription相关的知识,希望对你有一定的参考价值。
题意:招募N个男人,M个女人,每个人需要给10000块钱,但是如果跟自己亲密的人被招募了,那么可以少花一些钱,所以每个人的费用为10000-已招募的跟自己亲密度的最大值,求总费用
题解:
最大生成树
最大权森林,呵呵......
代价为森林的总权值
由于有重边,所以不能直接选每条边,构出最大生成树即可
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 #define ll long long 8 using namespace std; 9 10 int T,n,m,r,k,ans; 11 int fa[20010]; 12 13 struct Edge { 14 int x,y,z; 15 bool operator < (const Edge &a) const { 16 return z>a.z; 17 } 18 }e[50010]; 19 20 int gi() { 21 int x=0,o=1; char ch=getchar(); 22 while(ch!=‘-‘ && (ch<‘0‘ || ch>‘9‘)) ch=getchar(); 23 if(ch==‘-‘) o=-1,ch=getchar(); 24 while(ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); 25 return o*x; 26 } 27 28 int find(int x) { 29 return x==fa[x]?x:fa[x]=find(fa[x]); 30 } 31 32 int main() { 33 T=gi(); 34 while(T--) { 35 n=gi(),m=gi(),r=gi(),k=ans=0; 36 for(int i=1; i<=r; i++) { 37 int x=gi()+1,y=gi()+n+1,z=gi(); 38 e[i]=(Edge){x,y,z}; 39 } 40 n+=m; 41 sort(e+1,e+r+1); 42 for(int i=1; i<=n; i++) fa[i]=i; 43 for(int i=1; i<=r; i++) { 44 int x=e[i].x,y=e[i].y,xx,yy; 45 xx=find(x),yy=find(y); 46 if(xx==yy) continue; 47 fa[yy]=xx; 48 ans+=e[i].z,k++; 49 if(k==n-1) break; 50 } 51 printf("%d\n", 10000*n-ans); 52 } 53 return 0; 54 }
以上是关于[poj3723] Conscription的主要内容,如果未能解决你的问题,请参考以下文章