標籤:最大產生樹
//N個女孩,M個男孩,僱傭一個人的費用為10000 //男孩與女孩之間的關係為d,那麼如果僱傭了一個,僱傭另一個的費用為10000-d//每個人只能通過一種關係優惠//問最少需要花費多少僱傭這些人//很明顯的最大產生樹#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std ;const int maxn = 50010 ;struct node{ int u , v , w ;}edge[maxn];bool cmp(node a , node b){ return a.w > b.w ;}int F[maxn*2] ;int find(int x){ if(F[x] == -1)return x ; return F[x] = find(F[x]) ;}int r ;int n , m ;int kruskal(){ int ans = 0 ; for(int i = 1;i <= r;i++) { int fu = find(edge[i].u) ; int fv = find(edge[i].v) ; if(fu == fv)continue ; ans += edge[i].w ; F[fu] = fv ; } return ans ;}int main(){ //freopen("in.txt" , "r" , stdin) ; int t ; scanf("%d" , &t) ; while(t--) { scanf("%d%d%d" , &n , &m , &r) ; memset(F , -1 , sizeof(F)) ; for(int i = 1;i <= r;i++) { scanf("%d%d%d" , &edge[i].u , &edge[i].v , &edge[i].w) ; edge[i].v += maxn ; } sort(edge + 1 , edge + 1 + r , cmp) ; int ans = kruskal() ; cout<<(n+m)*10000 - ans<<endl; } return 0 ;}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
poj3723Conscription kruskal模板水題