POJ 3723 Conscription【最小生成树】

题意:

征用一些男生和女生,每个应都要给10000元,但是如果某个男生和女生之间有关系,则给的钱数为10000减去相应的亲密度,征集一个士兵时一次关系只能使用一次。

分析:

kruskal求最小生成树,注意男生和女生用偏移量处理。

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct edge{int u, v, w;};
const int maxn = 20050, maxm = 50005;
edge e[maxm];
int n, m ,R;
int pa[maxn], _rank[maxn];
bool cmp(const edge &e1,const edge &e2)
{
    return e1.w<e2.w;
}
int _find(int a)
{
    if(a == pa[a]) return a;
    else return pa[a] = _find(pa[a]);
}
void unite(int a, int b)
{
    int ra = _find(a), rb = _find(b);
    if(_rank[ra] < _rank[b]) pa[ra] = rb;
    else{
        pa[rb] = ra;
        if(_rank[ra] == _rank[rb]) _rank[ra]++;
    }
    return;
}
int same(int a, int b)
{
    return _find(a) == _find(b);
}
int kruskal(int r)
{
    sort(e, e+r, cmp);
    for(int i = 0; i <  n+m; i++){
       pa[i] = i;
    }
    int res = 0;
    for(int i = 0; i < r; i++){
        if(!same(e[i].u,e[i].v)){
            unite(e[i].u, e[i].v);
            res += e[i].w;
        }
    }
    return res;
}
int main (void)
{
    int c;scanf("%d",&c);
    while(c--){
        fill(_rank, _rank + n + m, 1);
        scanf("%d%d%d",&n,&m,&R);
        int x, y, r;
        for(int i = 0; i < R;i++){
            scanf("%d%d%d",&x, &y, &r);
            e[i] = (edge){x, y + n, -r};
      }
      printf("%d\n",10000*(n+m) + kruskal(R));
    }
}

转载于:https://www.cnblogs.com/Tuesdayzz/p/5758806.html

poj 3723(最大权森林) 题意:要招募n个男兵和m个女兵,而每招募一个人都要花费10000,这可是笔大开销,还好,可以用男女之间的关系减少费用,因为当招募一个士兵时,如果已招的人里与其有t点关系,则只需10000-n的费用。                  给出r对关系,求出最少费用。      分析:当招募b时,若用了b与a 的关系,则在a和b之间连一条边,很明显,当全部招募后,会连出一个森林,这个森林的总权值就是 阅读详情

相关推荐

poj3723(kruskal最大生成树)

解题思路:最小生成树裸题,由于边的数目比较少,所以选用复杂度为O(ElogV)的kruskal算法,和最小生成树的区别是边的排序由大到小排。 #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;iostream&gt; #include&lt;algorithm&gt; using namespace std; struct e...

qq_39861441的博客 357

POJ 3723 Conscription最小生成树

题目链接 题目大意: 解题思路: 本题最大干扰是男女配对,其实这个条件一点用都没有,不要想复杂了(想成了二分图,我一开始就是这么想的。。。。) 题目要求招募n个女兵,m个男兵;但是一共就n个女兵,m个男兵,也就是说全都招募了 解法很明显,让(10000 - di)求和最小,也就是边权di求和最大,就是“最大生成树“; 那么就来实现一下最大生成树算法就行! 最大生成树算法(其实就是最小生成树的变种) 把表达式变形一下就是 10000 * (n + m) + (-d1 - d2 - d3 - d4 -

359

POJ 3723 Conscription(最小生成树 kruskal)

POJ交题最好不用c++ 很容易卡时间 用c就过了 猛男落泪。 kruskal算法最小生成树 无向图求解最大权森林的问题 需要注意两个点: 1.男女序号问题 他们需要有唯一标识,这样才能正常连起来(男兵m编号+n就行了)。 2.cost权值需要变负,因为求得是男女之间最大的亲密度(要最小花费嘛)加个负号排序才能最大优先啊。 /* qq:1239198605 ctgu_yy...

k_koris的博客 313

POJ - 3723 Conscription 最小生成树

poj3723 大意:题目给定n个女同学,m个男同学,让后给若干个男女关系,每个关系都有一个特定值c,雇佣一个人10000元,而如果当前雇佣的人与已经雇佣的人有关系的话,雇佣钱数就可以-c。要求雇佣所有人花的最少钱数。 还是比较简单的,被自己的假算法骗到了。。。把给定的若干关系看成一个个连通块,对于每个连通块,拿10000元买一个人,让后剩下的人就都可以用优惠之后的价格购买了。这也是比较显然的,因为每个优惠关系最终只能优惠到一个人,需要另一个被雇佣了才能优惠嘛,所以跑一遍最小生成树,让后加上连通块个数*10

DaNIelLAk的博客 313

poj 3723 Conscription 最小生成树 Java

poj 3723 Conscription 买一个人就可以利用一个关系(一条边),一开始买一个人肯定是要10000的,然后再买一个人就可以根据他之前买的那个人的关系进行减价,相当于一共买n个人的话,是利用到n - 1 条边,所以要构建最大生成树。然后每个人都要基本的10000块,所以答案就是每个人10000 然后减去最大生成树里的所有边的权重。 package 图论; import java.io.BufferedReader; import java.io.IOException; import java

weixin_46621409的博客 233

poj3723 Conscription 最小生成树

原题链接:poj3723 Conscription #include #include #include using namespace std; const int MAX_N = 10010 * 2; const int MAX_E = 50010; int N, M, V, E; //顶点数和边数 struct edge{ //cost为u到v边的长度 int u, v

anchorite 1363

[POJ3723] Conscription [最小生成树]

求最大生成树,然后用总值减去即可 也可以重新构造这个图,直接求最小生成树

jinzhao1994的专栏 526

POJ3723 Conscription 最小生成树

传送门:【POJ3723 Conscription

poursoul 906

poj 3723 Conscription(最小生成树)

Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11677   Accepted: 4124 Description Windy has a country, and he wants to build an army to protect

CillyB的博客 610

Conscription POJ - 3723最小生成树+并查集)

题目: 传送门 思路: 把人看成点,征募花费看作边,那么就有一个无向图,因为当x和y关系是d时,在已招募x的情况下招募y的花费是10000-d,最小化花费等价于最大化d,故就是求“最大支撑树”(有V个节点,V-1条边,且边权重和最大),进而把d保存为-d,就转换成求无向图的最小生成树问题,直接套模板解决,注意,最后要用10000*V(人数)-最小生成树的边权和 Code: #include <iostream> #include <cstdio> #include <cmath

『 』的博客 205

POJ-3723 Conscription(最小生成树)

Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11386   Accepted: 4020 Description Windy has a country, and he wants to build an army to protect

十分残念的博客 353

POJ - 3723 Conscription最小生成树,Kruskal)

Windy has a country, and he wants to build an army to protect his country. He has picked up N girls and M boys and wants to collect them to be his soldiers. To collect a soldier without any privilege,...

洛 水 282

POJ, 3723 Conscription(最小生成树)

题意:征女兵n人,男兵m人。每征兵一个人话费10000美元,如果已经征的人中有关系亲密的人,征另外的人是10000减去亲密度,求最少费用。 分析:建立森林,边的权值为亲密度的相反数,然后用最小生成树连接所有点,得到可以节约的最大费用(是负数),结果也就出来了。 #include #include #include #include #inclu

哎哟不错哦的博客 376

poj 3723 Conscription最小生成树

题意:给你n个女的,m个男的,然后他们之间有r条边,权值是亲密度,然后现在要你招募他们(就是把他们连起来),如果直接招募是一个人10000,如果用关系招募(就是连边),花费是10000-这条边的权值 题解:我开头没看懂题目,以为极难,其实就是给你n+m个点,然后把他们连起来的最小费用啊 考虑到一些人可能是用10000招募的,一些人是用关系招募的,等于是有一个点(不是0-n+m),它到每个点的距

Miracle_ma的专栏 385

POJ 3723 Conscription(并查集+最小生成树

题目链接:https://cn.vjudge.net/problem/POJ-3723 大意:需要招募女兵N人,男兵M人。每招募一个人需要花费10000美元。但是如果已经招募的人中有一些关系亲密的人,那么可以少花一些钱(10000-亲密值)。给出若干男女之间的亲密关系,求招募所有人的最小费用。(招募每个人时只能用一条关系) 思路:将人看做点(N+M个点),关系看作边,边权为亲密值的相反数。首先

Interstellar_的博客 473

POJ 3723 Conscription 最小生成树

【代码】POJ 3723 Conscription 最小生成树

qq_53038151的博客 132

poj 3723 Conscription 最小生成树

Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8455   Accepted: 2949 Description Windy has a country, and he wants to build an army to protec...

weixin_33695082的博客 184
上一篇: POJ 3279 Fliptile【枚举】
下一篇: POJ 3255_Roadblocks
An55511
博客等级 码龄10年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值