首页 > 其他分享 >Party 题解

Party 题解

时间:2023-03-19 21:13:37浏览次数:47  
标签:sy sx int 题解 fa Party root find

题目传送门

一道简单的并查集练手题。

与普通的并查集不同,除此之外还需记录下来某两人的讨厌关系,使得他们不能在同一集合中。

if (find_root(x) == find_root(y)) vis[find_root(x)] = 1;

剩下的就是并查集了,神犇可以直接跳过。

查找根:

int find_root(int n) {
    if (fa[n] == n) return n;
    return fa[n] = find_root(fa[n]);
}

合并:

void merge(int x, int y) { 
    int sx = find_root(x), sy = find_root(y);
    if (sx != sy) fa[sx] = sy;
}

预处理:

for (int i = 1; i <= n; i++) fa[i] = i;

最后贴上代码

#include <bits/stdc++.h>
#define ll long long
#define INF 1e9
using namespace std;
int n, k, m, ans; // ans 需初始化为 0
int cnt[2005], fa[2005]; 
bool vis[2005]; // 标记
int find_root(int n) { // 查找根
    if (fa[n] == n) return n;
    return fa[n] = find_root(fa[n]);
}
void merge(int x, int y) { // 合并
    int sx = find_root(x), sy = find_root(y);
    if (sx != sy) fa[sx] = sy;
}
signed main() {
    ios :: sync_with_stdio(0);
	cin >> n >> k;
	for (int i = 1; i <= n; i++) fa[i] = i; // 预处理
	for (int i = 1; i <= k; i++) {
		int u, v;
		cin >> u >> v;
		merge(u, v);
	}
	for (int i = 1; i <= n; i++) cnt[find_root(i)]++; // 统计派对人数
	cin >> m;
	for (int i = 1; i <= m; i++) {
		int x, y;
		cin >> x >> y;
		if (find_root(x) == find_root(y)) vis[find_root(x)] = 1; // 标记关系
	}
	for (int i = 1; i <= n; i++) {
		if (!vis[find_root(i)]) ans = max(ans, cnt[find_root(i)]); // 如果没有讨厌的人就更新最大值
	}
	cout << ans;
    return 0;
}

标签:sy,sx,int,题解,fa,Party,root,find
From: https://www.cnblogs.com/xvl-/p/17234278.html

相关文章

  • CF1060E 题解
    前言题目传送门!更好的阅读体验?提供一种更加麻烦的换根DP写法。思路代码#include<iostream>#include<cstdio>usingnamespacestd;typedeflonglongll;cons......
  • 3 月 15 日测试题解
    3月15日测试题解这学校的评测机我是真的吐了,\(\text{380pts}\rightarrow\text{300pts}\),电脑速度跟BZOJ有的一拼。一句话总结:简单,过于简单,但是在练习读题能力上十......
  • 3 月 19 日测试题解
    3月19日测试题解原来这就是AK的滋味吗,不过,我却完全没感到开心呢。T1题意给出两个整数\(a\),\(b\),重复以下操作直到\(a=b\):设\(a>b\),否则交换\(a\)与\(......
  • P5445 [APIO2019] 路灯 题解
    题目链接题目描述给你一个01串,有\(q\)个时刻,每个时刻要么把一位取反,要么问你在过去的所有时刻中有多少个时刻\(a\)和\(b-1\)之间都为1。题目分析观察题目,我们......
  • 2023.3.19 模拟赛题解
    银行取款题意在现代文明社会中,大家在诸如银行办理业务、车站买票等活动时都很文明,没有插队的现象,本着"先来先服务"的规矩。初赛已经结束了,凡凡的爸爸打算上银行去取点......
  • 【问题解决】Linux 下 VSCode IntelliSense 对 C 语言读写锁类型报错的问题
    如图下图所示,当我们想要使用C语言读写锁类型时,IntelliSense会提示如下未定义的错误:IntelliSense提示错误但是,如果忽略这些错误,直接`gcc-o`程序又没有问题。通......
  • 题解:【ARC112C】 DFS Game
    题目链接题目里面的注意点还是很多的,如果读错了题整个思路可能会一点都不对。首先是移动和选取硬币的操作是分开的,所以你移动到了一个有硬币的节点,将是你的对手获得硬币。......
  • .net6 docker部署,以及问题解决(附Dokerfile)
    搭建仓库,发布配置docker搭建私有仓库参考上文,搭建好私有仓库,成功访问http://127.0.0.1:5000/v2/_catalog之后:在VS右键=>添加=>Docker支持=>选择Linux,即可自动......
  • 蓝桥楼赛第23期-工作文件整理归类 题解
    题目描述实小楼同学平常的工作比较繁杂,经常需要处理各类文档,几天时间桌面上就累积了一堆不同类型和名称的文档,显得十分杂乱。实小楼想通过Python编写一个脚本,能够自动归......
  • Tree Depth P 题解
    TreeDepth题意\(~~~~\)对一个排列建立小根笛卡尔树,定义第\(i\)个位置的权值为其在笛卡尔树上的深度。求对于所有恰好有\(k\)个逆序对的排列,每个位置的权值和对一......