博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1854
阅读量:5257 次
发布时间:2019-06-14

本文共 1118 字,大约阅读时间需要 3 分钟。

二分图匹配/并查集

其实我们发现,这里的方案就是希望从一开始一直能够被匹配上,那么我们就设立1-10000个点,一个装备向对应的属性连边,那么我们从1开始跑匹配,直到不能匹配结束。

但是这样很明显不是正解,我们把每个装备的两个属性之间连边,把小的属性连向大的属性,如果这两个属性已经相连,那么我们把大的属性赋值访问过,否则相连,把小的属性赋值相连,然后就是统计答案,我们找到第一个未访问的点i,答案就是i-1

原理是什么呢?引用hzwer

将每个武器变成一条边 连接两个属性

如果一个联通块形成了一棵n个点的树 那么只能满足其中的n-1个的点

如果一个联通块有一个环 那么就能满足所有的点

于是我们用并查集维护图的连通性,对于每个集合记录这个联通块有没有环,以及这个联通块中最大的点是多少

一旦某个点所在并查集中无环且最大的点是自己那么就可以输出答案了

一个联通块里如果没有环,那么最大的不能选,否则都能选,正确性显然,vis记录是否能选

#include
using namespace std;const int N = 1000010; int n;int fa[N], vis[N];inline int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }int main(){ scanf("%d", &n); for(int i = 1; i <= 10000; ++i) fa[i] = i; for(int i = 1; i <= n; ++i) { int u, v, x, y; scanf("%d%d", &u, &v); x = find(u); y = find(v); if(x == y) vis[x] = 1; else { if(x < y) swap(x, y); vis[y] = 1; fa[y] = x; } } for(int i = 1; i <= 10001; ++i) if(!vis[i]) { printf("%d\n", i - 1); return 0; } return 0;}
View Code

 

转载于:https://www.cnblogs.com/19992147orz/p/7462599.html

你可能感兴趣的文章
110104_LC-Display(液晶显示屏)
查看>>
httpd_Vhosts文件的配置
查看>>
php学习笔记
查看>>
普通求素数和线性筛素数
查看>>
PHP截取中英文混合字符
查看>>
【洛谷P1816 忠诚】线段树
查看>>
电子眼抓拍大解密
查看>>
poj 1331 Multiply
查看>>
tomcat7的数据库连接池tomcatjdbc的25个优势
查看>>
Html 小插件5 百度搜索代码2
查看>>
P1107 最大整数
查看>>
多进程与多线程的区别
查看>>
Ubuntu(虚拟机)下安装Qt5.5.1
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
java 常用命令
查看>>
CodeForces Round #545 Div.2
查看>>
卷积中的参数
查看>>
51nod1076 (边双连通)
查看>>
Item 9: Avoid Conversion Operators in Your APIs(Effective C#)
查看>>
深入浅出JavaScript(2)—ECMAScript
查看>>