[ABC304E] Good Graph

简单并查集。

考虑先对图进行并查集,令 fif_i 表示 ii 号节点在并查集中用 getfa 找到的结果。

对于添加边 uvu \leftrightarrow vuuvv 分别所在的连通块中的每一对点都会变得联通,也就是对于所有 x,y(fx=fu,fy=fv)x,y(f_x = f_u, f_y=f_v)xxyy 会从本身不连通变成联通,于是我们只需要处理这 kk 组中是否有一组满足这个条件,用 set 即可。

#include <bits/stdc++.h>
//#include <bits/extc++.h>
using namespace std;
//using namespace __gnu_pbds;
//using namespace __gnu_cxx;
//#define int long long

const int N = 2e5 + 5, MOD = 1e9 + 7; // Remember to change

int n, m, q, k;
int x[N], y[N];
vector<int> G[N]; 

class Dsu
{
public:
	int fa[N];
	void Init()
	{
		for (int i = 0; i < N; i++) fa[i] = i;
	}
	int find(int u)
	{
		return (fa[u] == u ? u : fa[u] = find(fa[u]));
	}
}dd;

int main()
{
	scanf("%d%d", &n, &m);
	dd.Init();
	for (int i = 1; i <= m; i++)
	{
		int u, v;
		scanf("%d%d", &u, &v);
		G[u].emplace_back(v);
		G[v].emplace_back(u);
		dd.fa[dd.find(u)] = dd.find(v); 
	}
	scanf("%d", &k);
	set<pair<int, int> > st;
	for (int i = 1; i <= k; i++)
	{
		scanf("%d%d", &x[i], &y[i]);
		st.insert(make_pair(dd.find(x[i]), dd.find(y[i])));
	}
	scanf("%d", &q);
	while (q--)
	{
		int u, v;
		scanf("%d%d", &u, &v);
		u = dd.find(u), v = dd.find(v);
		if (st.count(make_pair(u, v)) || st.count(make_pair(v, u))) printf("No\n");
		else printf("Yes\n");
	}
	return 0;
}
posted @   HappyBobb  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示