题目链接:点击查看

题目大意:给出两个数组 a[ i ]  和 b[ i ],每次可以从 a[ i ] 和 b[ i ] 中选择一个数,求最后选出的数中,不同的数的个数最多

题目分析:比赛时用网络流乱搞水过去了,但是现在都不知道为什么那样建图能过

正解是并查集,将每对 a[ i ] 和 b[ i ] 视为一条边后,n 条边连接之后,会出现数个连通块,对于每个连通块我们分两种情况讨论:

  1. 连通块是个树:有 n 个点和 n - 1 条边,因为每条边最多选一个点,所以 n - 1 条边最多只能选 n - 1 个点
  2. 连通块存在至少一个环:那么此时 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(并查集)相关推荐

  1. 2020牛客暑期多校训练营(第八场)I.Interesting Computer Game并查集

    题目链接:Interesting Computer Game 题意 n个回合,每个回合输出两个数,分别是ai.bi,且每个回合求进行三个操作中的一个操作,分别是①不进行操作,②如果之前的回合中未选出过 ...

  2. 牛客小白月赛25 C 白魔法师 并查集

    链接:https://ac.nowcoder.com/acm/contest/5600/C 来源:牛客网 题目描述 你是一个白魔法师. 现在你拿到了一棵树,树上有 个点,每个点被染成了黑色或白色. 你 ...

  3. 牛客练习赛24 B凤 凰(并查集考察)

    链接:https://www.nowcoder.com/acm/contest/157/B 来源:牛客网 题目描述 凤凰于飞,翙翙其羽,亦集爰止. --<诗经·卷阿> 传说,凤凰是百鸟之王 ...

  4. 【Nowcoder】2020牛客暑期多校训练营(第八场)I - Interesting Computer Game | 并查集、思维、离散化

    题目链接:https://ac.nowcoder.com/acm/contest/5673/I 题目大意: 从1~n给出n组数据,每次可以选择a 或者选择b,选了之后不能在选,问最多选多少个? 题目思 ...

  5. 牛客-小w的魔术扑克【并查集】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/1100/C 题目大意 nnn个数字mmm张扑克牌,每张两面有各有一个数字,可以选择一些扑克牌使用正面的数字,一 ...

  6. 【牛客 - 368D】动态连通块(并查集+bitset优化)

    题干: 小T有n个点,每个点可能是黑色的,可能是白色的. 小T对这张图的定义了白连通块和黑连通块: 白连通块:图中一个点集V,若满足所有点都是白点,并且V中任意两点都可以只经过V中的点互相到达,则称V ...

  7. 牛客小白月赛25 C-白魔法师 ( 图论 + 并查集 )

    题目链接 解题报告: 思路:如果将一个黑色点染成白色,那么将得到一个白色连通块,这个连通块由和这个黑色点连结的所有白色连通块组成. 如果将一个白色点染成白色,那么不会有任何变化. 所以我们可以先并查集 ...

  8. 牛客小白月赛2 D. 虚虚实实(欧拉回路,并查集)

    题目描述 震为雷,临危不乱,亨通畅达:巽为风,柔顺伸展,厚载万物. 震卦:洊雷,震,君子以恐惧修省.一口金钟在淤泥,人人拿着当玩石,忽然一日钟悬起,响亮一声天下知. 巽卦:随风,巽,君子以申命行事.一 ...

  9. 牛客多校三 B Black and white

    牛客多校三 B Black and white 在n*m的棋盘上,每个格子有一个数,初始可以选一定的格子标记为黑色,在任意四个形如(i1, j1)(i1, j2)(i2, j1)(i2, j2)的格子 ...

最新文章

  1. kali工具中文手册_Kali Linux 2019.4发布了!解决Kali Linux 2019.4中文乱码问题
  2. zabbix安装步骤
  3. [Android Pro] ant 编译android工程
  4. android java 面试题,Android java 高级面试题库
  5. 我也谈谈代码的性能测试及代码改进
  6. bst java_图解:二叉搜索树算法(BST)
  7. 寒冬、裁员?!你想知道的真相都在这里
  8. python重试库retryiny源码剖析
  9. wget 下载 设置cookie
  10. html使用iframe包含pdf文件,HTMLiframe用法总结收藏.pdf
  11. python的cubes怎么使用_Python measure.marching_cubes方法代碼示例
  12. 02139 计算机信息检索[成都理工大学自考复习]
  13. RK3568平台开发系列讲解(安卓适配篇)Android11旋转屏幕
  14. Lonza高通量384孔Nucleofector电转平台
  15. 图片识别出处_搜图神器!你还在问图片的出处吗?
  16. php微信摇一摇开发文档,摇一摇关注的JSAPI
  17. 爱,不留——陈光标裸捐之后
  18. 帮我写1000字《阿凡达》观后感
  19. Ordinal numeral
  20. 家庭理财管理系统/家庭财务管理系统

热门文章

  1. 语言余一个负数_C语言学习日记(8)——整数溢出
  2. MySQL高级 - 常用工具 - mysqlshow
  3. 声明一个队列,并且指定TTL
  4. rabbitmq常用配置
  5. 后置通知(After Advice)
  6. 垂直拆分后,遇到瓶颈,数据水平拆分
  7. 开启MyBatis日志Sql打印
  8. 依赖版本控制-pom文件介绍
  9. Stream流的常见生成方式
  10. 反射_Class对象功能_获取Constructor