• 原题如下:

    Conscription
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 16584   Accepted: 5764

    Description

    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, he must pay 10000 RMB. There are some relationships between girls and boys and Windy can use these relationships to reduce his cost. If girl x and boy y have a relationship d and one of them has been collected, Windy can collect the other one with 10000-d RMB. Now given all the relationships between girls and boys, your assignment is to find the least amount of money Windy has to pay. Notice that only one relationship can be used when collecting one soldier.

    Input

    The first line of input is the number of test case.
    The first line of each test case contains three integers, NM and R.
    Then R lines followed, each contains three integers xiyi and di.
    There is a blank line before each test case.

    1 ≤ NM ≤ 10000
    0 ≤ R ≤ 50,000
    0 ≤ xi < N
    0 ≤ yi < M
    0 < di < 10000

    Output

    For each test case output the answer in a single line.

    Sample Input

    2
    
    5 5 8
    4 3 6831
    1 3 4583
    0 0 6592
    0 1 3063
    3 3 4975
    1 3 2049
    4 2 2104
    2 2 781 5 5 10
    2 4 9820
    3 2 6236
    3 1 8864
    2 4 8326
    2 0 5156
    2 0 1463
    4 1 2439
    0 4 4373
    3 4 8889
    2 4 3133

    Sample Output

    71071
    54223
  • 题解:设想这样一个无向图:在征募某个人a时,如果使用了a和b之间的关系,那么就连一条a到b的边,假设这个图中存在圈,那么无论以什么顺序征募这个圈上的所有人,都会产生矛盾,即由于圈的存在,矛盾是必然的,由此可以知道,这个图应该是一片森林。反过来,给定一片森林里,必然可以使用对应的关系确定征募的顺序。综上,把人看作点,关系看作边,这个问题就可以转化为求解无向图中的最大权森林问题,最大权森林问题可以通过把所有边权取反后用最小生成树的算法求解
  • 代码:
     #include <cstdio>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #include <cctype>
    #define num s-'0' using namespace std; struct edge
    {
    int u;
    int v;
    int cost;
    }; const int MAX_V=;
    const int MAX_E=;
    const int INF=0x3f3f3f3f;
    int K,N, M, E, V;
    edge es[MAX_E];
    long long res;
    int par[MAX_V];
    int r[MAX_V]; void kruskal();
    void init();
    int find(int);
    void unite(int, int);
    bool same(int, int); void read(int &x){
    char s;
    x=;
    bool flag=;
    while(!isdigit(s=getchar()))
    (s=='-')&&(flag=true);
    for(x=num;isdigit(s=getchar());x=x*+num);
    (flag)&&(x=-x);
    } void write(int x)
    {
    if(x<)
    {
    putchar('-');
    x=-x;
    }
    if(x>)
    write(x/);
    putchar(x%+'');
    } bool compare(const edge &e1, const edge &e2)
    {
    return e1.cost<e2.cost;
    } int main()
    {
    read(K);
    for (int j=; j<K; j++)
    {
    res=;
    read(N);read(M);read(E);V=N+M;
    for (int i=; i<E; i++)
    {
    read(es[i].u);read(es[i].v);read(es[i].cost);
    es[i].v+=N;es[i].cost=-es[i].cost;
    }
    kruskal();
    write(*(N+M)+res);
    putchar('\n');
    }
    } void init()
    {
    for (int i=; i<V; i++)
    {
    par[i]=i;
    r[i]=;
    }
    } int find(int x)
    {
    if (par[x]==x) return x;
    return par[x]=find(par[x]);
    } void unite(int x, int y)
    {
    x=find(x);
    y=find(y);
    if (x==y) return;
    if (r[x]<r[y]) par[x]=y;
    else
    {
    par[y]=x;
    if (r[x]==r[y]) r[x]++;
    }
    } bool same(int x, int y)
    {
    return (find(x)==find(y));
    } void kruskal()
    {
    sort(es, es+E, compare);
    init();
    for (int i=; i<E; i++)
    {
    edge e=es[i];
    if (!same(e.u, e.v))
    {
    unite(e.u, e.v);
    res+=e.cost;
    }
    }
    }

Conscription(POJ 3723)的更多相关文章

  1. MST:Conscription(POJ 3723)

      男女搭配,干活不累 题目大意:需要招募女兵和男兵,每一个人都的需要花费1W元的招募费用,但是如果有一些人之间有亲密的关系,那么就会减少一定的价钱,如果给出1~9999的人之间的亲密关系,现在要你求 ...

  2. Day5 - D - Conscription POJ - 3723

    Windy has a country, and he wants to build an army to protect his country. He has picked up N girls ...

  3. poj - 3723 Conscription(最大权森林)

    http://poj.org/problem?id=3723 windy需要挑选N各女孩,和M各男孩作为士兵,但是雇佣每个人都需要支付10000元的费用,如果男孩x和女孩y存在亲密度为d的关系,只要他 ...

  4. POJ 3723 Conscription(并查集建模)

    [题目链接] http://poj.org/problem?id=3723 [题目大意] 招募名单上有n个男生和m个女生,招募价格均为10000, 但是某些男女之间存在好感,则招募的时候, 可以降低与 ...

  5. POJ 3723 Conscription MST

    http://poj.org/problem?id=3723 题目大意: 需要征募女兵N人,男兵M人,没征募一个人需要花费10000美元,但是如果已经征募的人中有一些关系亲密的人,那么可以少花一些钱, ...

  6. POJ 3723 Conscription 最小生成树

    题目链接: 题目 Conscription Time Limit: 1000MS Memory Limit: 65536K 问题描述 Windy has a country, and he wants ...

  7. POJ 3723 Conscription

    Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6325   Accepted: 2184 Desc ...

  8. POJ 3723 Conscription (Kruskal并查集求最小生成树)

    Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14661   Accepted: 5102 Des ...

  9. 【POJ - 3723 】Conscription(最小生成树)

    Conscription Descriptions 需要征募女兵N人,男兵M人. 每招募一个人需要花费10000美元. 如果已经招募的人中有一些关系亲密的人,那么可以少花一些钱. 给出若干男女之前的1 ...

随机推荐

  1. kereas 实现鸢尾花分类

    import tensorflow as tf from sklearn import datasets import numpy as np x_train=datasets.load_iris() ...

  2. STM32 重启之后程序丢失

    1 BOOT1 BOOT0都已经接10K接地,晶振波形正常 2 在主程序最开始运行的地方加入5秒的延时,程序不会丢失.原因可能为单片机其它外设没有准备好 int main(void) { delay_ ...

  3. 面试不知如何回答这六大知识点,你还敢说熟悉MySQL?

    文章目录 一.事务 1. 什么是事务 2. 事务的四大特性 3. 事务的并发问题 ① 事务并发问题什么时候发生? ② 事务的并发问题有哪些? ③ 如何避免事务的并发问题? 二.索引 1. 什么是索引 ...

  4. HotSpot的垃圾回收器

    如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.这里讨论的收集器基于JDK 1.7 Update 14之后的 HotSpot 虚拟机,这个虚拟机包含的所有收集器如下图所示 上图 ...

  5. Windows 安装 kafka

    1.kafka下载地址:http://kafka.apache.org/downloads 解压:kafka_2.12-2.6.0.tgz 2.配置zookeeper 进入config目录找到文件zo ...

  6. 使用folderLeft函数统计字母出现的次数

    实例:统计字符串中字母出现的次数 import scala.collection.mutable object Demo_018{ def main(args: Array[String]): Uni ...

  7. Qt 实现 异形 窗体&按钮

    //关键部分代码如下//设置异形窗体 //setWindowOpacity(0.5);//设置窗体透明度 0完全透明,1完全不透明 this->setWindowFlag(Qt::Framele ...

  8. 计算机网络-链路层(4)WiFi:802. 11无线LAN

    有几套有关无线LAN 的802. 11标准,包括802.11b.802.11a和802.11g. 802.11g是至今为止最为流行的技术.一些双模式(802.11a/g)和三模式(802.11a/b/ ...

  9. Java 8新特性(三):Optional类

    在上一篇介绍Stream流式数据处理的文章中提到了Optional类,这是Java 8新增的一个类,用以解决程序中常见的NullPointerException异常问题.本篇文章将详细介绍Option ...

  10. 区块链入门到实战(33)之Solidity – 数据类型

    在用任何语言编写程序时,都需要使用变量来存储各种信息.变量是内存空间的名称,变量有不同类型,例如整型.字符串类型等等.操作系统根据变量的数据类型分配内存. Solidity中,变量类型有以下几大类: ...