POJ, 3723 Conscription(最小生成树)

POJ-3723-最大生成树 天啦噜T^T。稍微的分析看得出这个招募顺序是一个森林,然后想不到是最大生成树。代码很裸。每一个关系就是两个点加一条边,构建一个最大生成树,每次检查两个点是否招募了,不管两个点是只有一个没招募还是两个都没招募,都是添加到最大生成树中去,然后这样都会节省出d的钱。最后用总钱数减去节省的钱就行了。#include <cstring> #include <cstdio> #incl... 阅读详情

题意:征女兵n人,男兵m人。每征兵一个人话费10000美元,如果已经征的人中有关系亲密的人,征另外的人是10000减去亲密度,求最少费用。

分析:建立森林,边的权值为亲密度的相反数,然后用最小生成树连接所有点,得到可以节约的最大费用(是负数),结果也就出来了。







#include <iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define N 50005
struct edge{
   int u,v,cost;
   bool operator<(const edge &a)const
   {
       return cost<a.cost;
   }
};
edge es[N];
int m,n,r;
int par[N],myrank[N];
void init(int n)
{
    for(int i=0;i<n;i++)
    {
        par[i]=i;
    }
    memset(myrank,0,sizeof(myrank));
}
int myfind(int x)
{
    if(x==par[x])
        return x;
    return par[x]=myfind(par[x]);
}
void unite(int x,int y)
{
    x=myfind(x);
    y=myfind(y);
    if(x==y)
        return ;
    if(myrank[x]>myrank[y])
       {
           par[y]=x;
       }
        else
        {
            par[x]=y;
            if(myrank[x]==myrank[y])
            {
               myrank[y]++;
            }
        }
}
bool same(int x,int y)
{
    return myfind(x)==myfind(y);
}
int kruskal()
{
    sort(es,es+r);
    init(m+n);
    int res=0;
    for(int i=0;i<r;i++)
    {
        edge e=es[i];
        if(!same(e.u,e.v)){
            unite(e.v,e.u);
        res+=e.cost;
        }
    }
    return res;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&r);
        init(n+m);
        for(int i=0;i<r;i++){
        scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].cost);
        es[i].v+=n;
        es[i].cost=-es[i].cost;
        }
       printf("%d\n", 10000*(m+n)+kruskal());

    }
    return 0;
}


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

POJ 3723 Conscription最小生成树

题意: 征用一些男生和女生,每个应都要给10000元,但是如果某个男生和女生之间有关系,则给的钱数为10000减去相应的亲密度,征集一个士兵时一次关系只能使用一次。 分析: kruskal求最小生成树,注意男生和女生用偏移量处理。 代码: #include<iostream> #include<algorithm> #in...

An55511的博客 171

POJ3723 Conscription 最小生成树

传送门:【POJ3723 Conscription

poursoul 906

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(最小生成树)

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最小生成树,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个男的,然后他们之间有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 最小生成树

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 3723 Conscription 最小生成树

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

qq_53038151的博客 132
上一篇: POJ, 3255 Roadblocks(次短路径)
下一篇: POJ 3169 Layout
哎哟_不错哦
博客等级 码龄11年 4粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值