题意

挑选N个女兵,M个男兵,雇佣每个人都需要支付10000元的费用,如果男a和女b存在亲密度d,只要他们其中有一个已经被选中,那么在选另一个人需要的费用为100000-d,给定R个关系,输出一个最低费用,每个关系只能使用一次。

思路

最大权森林转换为负权最小生成树( MST )
当时学最小生成树就这个博客上的图感觉非常好理解:
算法导论–最小生成树(Kruskal和Prim算法)

Kruskal

Prim

这个题用Prim居然MLE了….
用并查集维护Kruskal可以过

数据范围1 ≤ N, M ≤ 10000 , 0 ≤ R ≤ 50,000
如果用Prim应该是 20000*20000的邻接表, 用Kruskal则是50000条边, 显然用Kruskal更优~
最小生成树Prim与Kruskal算法的比较

AC代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define mst(a) memset(a, 0, sizeof a)
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 50000+5;
int f[20000+5];struct edge{int f, t, cost;
}cst[maxn];bool cmp(const edge& a, const edge& b){return a.cost < b.cost;
}int all, n, m, r;void bcj_init(){for( int i = 0; i < all; i++ )f[i] = i;
}int _find(int a){if( a != f[a] ) f[a] = _find(f[a]);return f[a];
}void unite(int a, int b){int aa = _find(a);int bb = _find(b);if( aa != bb ){f[bb] = aa;}
}int kruskal(){int res = 0;bcj_init();sort(cst, cst+r, cmp);for(int i = 0; i < r; i++){edge e = cst[i];if( _find(e.f) != _find(e.t) ){unite(e.f, e.t);res += e.cost;}}return res;
}int main()
{int T, a, b, c;scanf("%d",&T);while(T--){scanf("%d%d%d", &n, &m, &r);all = n+m;for(int i = 0; i < r; i++){scanf("%d%d%d",&a, &b, &c);cst[i] = (edge){a, b+n, -c};}int res = kruskal();printf("%d\n",all*10000+res);}return 0;
}

转载于:https://www.cnblogs.com/JinxiSui/p/9740538.html

POJ 3723 - Conscription ( 最大权森林 / 最小生成树 )相关推荐

  1. POJ 3723 Conscription 最小生成树

    想清楚后能发现就要让我们求最小生成树(如果图连通的话,否则就是森林) //#pragma comment(linker, "/STACK:1024000000,1024000000" ...

  2. poj 3723 Conscription (并查集)

    1 首先我们应该区分开男孩和女孩,只要将男孩的编号加上女孩的个数n,这样就可以做到男孩和女孩的编号是不同的. 2 题目中说了如果两个人有关系,并且其中一个人已经被选了那么选择另外一个人的时候只要100 ...

  3. 【POJ - 3723】Conscription (最大生成树,最小生成树MST变形)

    题干: Windy has a country, and he wants to build an army to protect his country. He has picked up N gi ...

  4. poj 2987 Firing (最大权 闭合 图)

    http://poj.org/problem?id=2987 题意: 公司要由于经济 问题 要 裁员工,已知,要采取某个 员工,那么 他的下属也将被 裁去,给出  裁出 n  个员公的 所获的利益 ( ...

  5. POJ - 2987 Firing(最大权闭合图)

    题目链接:点击查看 题目大意:某公司想要裁员,裁员的标准是如果某人被裁,那么其下属也会被裁,依此类推,每一个人都有一个贡献度,问怎样裁员才能使得最后的贡献度最大并且裁掉人数最少 题目分析:最大权闭合图 ...

  6. 【POJ 1679 The Unique MST】最小生成树

    无向连通图(无重边),判断最小生成树是否唯一,若唯一求边权和. 分析生成树的生成过程,只有一个圈内出现权值相同的边才会出现权值和相等但"异构"的生成树.(并不一定是最小生成树) 分 ...

  7. poj3723 招兵 最大权森林

    这是<编程挑战>的一道例题,证明网上大神很多都做了,我就简单说一下易错点吧. 第一点,这个人是从0开始查的,所以并查集初始化别忘了0. 第二点,这道题的克鲁斯卡尔要把所有的边都遍历一遍.因 ...

  8. POJ 2987 Firing 最大权闭合图

    Description You've finally got mad at "the world's most stupid" employees of yours and dec ...

  9. 2019.9.18最小生成树知识点总结

    HDU 4081 Qin Shi Huang's National Road System(次小生成树-Kruskal) 博主的方法很好,但是有疑问,为什么不能将最多人口的两城市的距离设置为0,在进行 ...

最新文章

  1. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY16-强化学习
  2. StackGAN mini review
  3. [源码和文档分享]基于C++实现的运动会统分系统
  4. webservice中jaxws:server 和jaxws:endpoint的区别
  5. 使用WeexSDK,网络请求信任证书的问题
  6. [scikit-learn 机器学习] 8. 非线性分类和决策树
  7. 迅雷游戏盒子下载|迅雷游戏盒子下载
  8. 卷积神经网络之ResNet网络模型学习
  9. DBCC命令2:状态查询
  10. android 添加注释,向Android Saripaar添加自定义注释
  11. python核心编程笔记chapter 14
  12. linux 查看mysql安装目录_Linux中安装Mysql
  13. 一篇很好的大牛面试经验
  14. 超窄带通信系统UNB原理以及简单模拟
  15. wmp流代理服务器设置为空,03服务器安装wmp10的方法
  16. 分享Java开发经验去鹅厂面试的经历,你值得~
  17. eclipse黄色波浪线去除
  18. 2020 dns排名_《2020年全球DNS威胁报告》:DNS攻击平均损失高达92万美元
  19. 性价比高的骨传导耳机,国产top1品牌推荐
  20. 大清早的发现github凉凉了

热门文章

  1. Android开发 ShapeDrawable详解
  2. React 之 高阶组件的理解
  3. 最新版Kubernetes常用命令大全
  4. Cordova/Ionic Android 开发环境搭建 - Windows系统
  5. jqueryGannt用法
  6. vue.js 前端开发常见问题
  7. Imagelist 控件
  8. Idea打Jar包的坑,工程使用ali druid 等ali组件
  9. CodeForces 839D - Winter is here | Codeforces Round #428 (Div. 2)
  10. Java 两线程交替打印奇偶数(一)