牛客多校8 - Interesting Computer Game(并查集)
题目链接:点击查看
题目大意:给出两个数组 a[ i ] 和 b[ i ],每次可以从 a[ i ] 和 b[ i ] 中选择一个数,求最后选出的数中,不同的数的个数最多
题目分析:比赛时用网络流乱搞水过去了,但是现在都不知道为什么那样建图能过
正解是并查集,将每对 a[ i ] 和 b[ i ] 视为一条边后,n 条边连接之后,会出现数个连通块,对于每个连通块我们分两种情况讨论:
- 连通块是个树:有 n 个点和 n - 1 条边,因为每条边最多选一个点,所以 n - 1 条边最多只能选 n - 1 个点
- 连通块存在至少一个环:那么此时 n 个点的话至少有 n 条边了,肯定存在一种方法可以将连通块中的所有点都选一遍
所以实现的话,可以用带权并查集,维护父节点的同时顺便维护一个布尔变量 circle ,代表当前的连通块内是否有环,数据较大需要离散化,我是 map 离散化,因为用 map 的话可以在线离散化
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;int f[N],cnt;bool circle[N];unordered_map<int,int>mp;int find(int x)
{return f[x]==x?x:f[x]=find(f[x]);
}void merge(int x,int y)
{int xx=find(x),yy=find(y);if(xx!=yy){f[xx]=yy;circle[yy]|=circle[xx];}elsecircle[xx]=true;
}void init()
{mp.clear();cnt=0;for(int i=0;i<N;i++){f[i]=i;circle[i]=false;}
}int main()
{
#ifndef ONLINE_JUDGE
// freopen("data.in.txt","r",stdin);
// freopen("data.out.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);int w;cin>>w;int kase=0;while(w--){init();int n;scanf("%d",&n);for(int i=1;i<=n;i++){int x,y;scanf("%d%d",&x,&y);if(!mp[x])mp[x]=++cnt;if(!mp[y])mp[y]=++cnt;merge(mp[x],mp[y]);}int ans=cnt;for(int i=1;i<=cnt;i++)if(f[i]==i&&!circle[i])ans--;printf("Case #%d: %d\n",++kase,ans);}return 0;
}
牛客多校8 - Interesting Computer Game(并查集)相关推荐
- 2020牛客暑期多校训练营(第八场)I.Interesting Computer Game并查集
题目链接:Interesting Computer Game 题意 n个回合,每个回合输出两个数,分别是ai.bi,且每个回合求进行三个操作中的一个操作,分别是①不进行操作,②如果之前的回合中未选出过 ...
- 牛客小白月赛25 C 白魔法师 并查集
链接:https://ac.nowcoder.com/acm/contest/5600/C 来源:牛客网 题目描述 你是一个白魔法师. 现在你拿到了一棵树,树上有 个点,每个点被染成了黑色或白色. 你 ...
- 牛客练习赛24 B凤 凰(并查集考察)
链接:https://www.nowcoder.com/acm/contest/157/B 来源:牛客网 题目描述 凤凰于飞,翙翙其羽,亦集爰止. --<诗经·卷阿> 传说,凤凰是百鸟之王 ...
- 【Nowcoder】2020牛客暑期多校训练营(第八场)I - Interesting Computer Game | 并查集、思维、离散化
题目链接:https://ac.nowcoder.com/acm/contest/5673/I 题目大意: 从1~n给出n组数据,每次可以选择a 或者选择b,选了之后不能在选,问最多选多少个? 题目思 ...
- 牛客-小w的魔术扑克【并查集】
正题 题目链接:https://ac.nowcoder.com/acm/contest/1100/C 题目大意 nnn个数字mmm张扑克牌,每张两面有各有一个数字,可以选择一些扑克牌使用正面的数字,一 ...
- 【牛客 - 368D】动态连通块(并查集+bitset优化)
题干: 小T有n个点,每个点可能是黑色的,可能是白色的. 小T对这张图的定义了白连通块和黑连通块: 白连通块:图中一个点集V,若满足所有点都是白点,并且V中任意两点都可以只经过V中的点互相到达,则称V ...
- 牛客小白月赛25 C-白魔法师 ( 图论 + 并查集 )
题目链接 解题报告: 思路:如果将一个黑色点染成白色,那么将得到一个白色连通块,这个连通块由和这个黑色点连结的所有白色连通块组成. 如果将一个白色点染成白色,那么不会有任何变化. 所以我们可以先并查集 ...
- 牛客小白月赛2 D. 虚虚实实(欧拉回路,并查集)
题目描述 震为雷,临危不乱,亨通畅达:巽为风,柔顺伸展,厚载万物. 震卦:洊雷,震,君子以恐惧修省.一口金钟在淤泥,人人拿着当玩石,忽然一日钟悬起,响亮一声天下知. 巽卦:随风,巽,君子以申命行事.一 ...
- 牛客多校三 B Black and white
牛客多校三 B Black and white 在n*m的棋盘上,每个格子有一个数,初始可以选一定的格子标记为黑色,在任意四个形如(i1, j1)(i1, j2)(i2, j1)(i2, j2)的格子 ...
最新文章
- kali工具中文手册_Kali Linux 2019.4发布了!解决Kali Linux 2019.4中文乱码问题
- zabbix安装步骤
- [Android Pro] ant 编译android工程
- android java 面试题,Android java 高级面试题库
- 我也谈谈代码的性能测试及代码改进
- bst java_图解:二叉搜索树算法(BST)
- 寒冬、裁员?!你想知道的真相都在这里
- python重试库retryiny源码剖析
- wget 下载 设置cookie
- html使用iframe包含pdf文件,HTMLiframe用法总结收藏.pdf
- python的cubes怎么使用_Python measure.marching_cubes方法代碼示例
- 02139 计算机信息检索[成都理工大学自考复习]
- RK3568平台开发系列讲解(安卓适配篇)Android11旋转屏幕
- Lonza高通量384孔Nucleofector电转平台
- 图片识别出处_搜图神器!你还在问图片的出处吗?
- php微信摇一摇开发文档,摇一摇关注的JSAPI
- 爱,不留——陈光标裸捐之后
- 帮我写1000字《阿凡达》观后感
- Ordinal numeral
- 家庭理财管理系统/家庭财务管理系统