poj 3723 Conscription 【最大生成树|最大权森林】
2014-12-06 10:02
267 查看
题目:poj 3723 Conscription
题意:要征兵n个男兵和m个女兵,每个花费10000元,但是如果已经征募的男士兵中有和将要征募的女士兵关系好的,那么可以减少花费,给出关系,求最小花费。
分析:这个题目初始一个是个二分图,以为可以从这里入手,但是这个题目这个性质没用。
初始花费没人10000,那么减去其中有关系的就是当前的花费。
要是花费最少,那么减去的最大即可,又因为没人只征募一次,即最多选择一个,所以减去一个最大生成树就ok
AC代码:
题意:要征兵n个男兵和m个女兵,每个花费10000元,但是如果已经征募的男士兵中有和将要征募的女士兵关系好的,那么可以减少花费,给出关系,求最小花费。
分析:这个题目初始一个是个二分图,以为可以从这里入手,但是这个题目这个性质没用。
初始花费没人10000,那么减去其中有关系的就是当前的花费。
要是花费最少,那么减去的最大即可,又因为没人只征募一次,即最多选择一个,所以减去一个最大生成树就ok
AC代码:
#include <cstdio> #include <string> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> using namespace std; const int N = 52000; const int M = 55000; int u ,v ,w ; int cmp(int x,int y) { return w[x]>w[y]; } int father ,p ; int find(int x) { if(father[x]==x) return x; return father[x] = find(father[x]); } int kru(int n, int m) { int ans=0, i; for(i=0; i<m; i++) p[i]=i; for(i=0; i<n; i++) father[i]=i; sort(p, p+m, cmp); for(i=0; i<m; i++) { int e=p[i]; int x=find(u[e]); int y=find(v[e]); if(x!=y) {ans+=w[e]; father[x]=y;} } return ans; } int main() { //freopen("a.txt","r",stdin); int n,m,r,T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&r); for(int i=0;i<r;i++) { int x; scanf("%d%d%d",&u[i],&x,&w[i]); v[i] = x+n; } int css = kru(m+n,r); printf("%d\n",(n+m)*10000-css); } return 0; }
相关文章推荐
- Poj 3723 Conscription -- 最大生成树(森林)
- POJ 3723 Conscription 【最大生成树||最大权森林】
- poj 3723 Conscription(最大生成树 kruscal)
- POJ 3723 Conscription【最大生成树】
- POJ 3723 Conscription(最大生成树)
- poj 3723 Conscription(最大生成树)
- POJ 3723 Conscription(最大生成森林)
- POJ 3723 Conscription (最大生成树,kruskal,并查集)
- POJ 3723 Conscription(kruskal求最大生成树)
- POJ-3723-Conscription最大生成树
- POJ - 3723 Conscription(kruskal+最大权森林)
- POJ3723 Conscription , 最大权森林问题 ->最小生成树问题
- POJ--3723---Conscription---最大生成树
- poj-3723 Conscription 最大生成树
- poj - 3723 Conscription(最大权森林)
- POJ 3723 Conscription(最大生成树)
- 最大权森林·POJ-3723·Conscription
- poj 3723 Conscription(最大生成树)
- POJ 3723 - Conscription(最大生成树)
- poj 3723 Conscription(最大生成树)