洛谷P1551题解

洛谷P1551题解

题目传送门:https://www.luogu.com.cn/problem/P1551

题目简述:

n个人,m个关系,p个询问,要输入谁和谁之间有亲戚关系,输出给定的两个人之间是否有亲戚关系

题目分析:

思路很显然,用无向图储存人之间的关系,然后进行dfs染色,查询的是否判断色号是否一致即可

  1. 储存亲戚关系用vector adj[maxn]来储存,比如a与b,c,d相邻,那么adj[a]就是一个动态数组,里面储存了b,c,d;
  2. 染色:遍历所有人,对每个人进行dfs

代码:

#include<cstdio>
#include<cstring>
#include<vector>

using namespace std;

int n, m, p;

const int maxn = 5000 + 10;
int arr[maxn];
int vis[maxn];
vector<int> adj[maxn];
int cnt = 1;

void dfs(int d) {
	if (vis[d])return;

	arr[d] = cnt;
	vis[d] = 1;
	for (auto u : adj[d]) {
		if (!vis[u]) {
			dfs(u);
		}
	}
}

int main() {
	scanf("%d%d%d", &n, &m, &p);
	for (int i = 0; i < m; i++) {
		int u, v;
		scanf("%d %d", &u, &v);
		adj[u].push_back(v);
		adj[v].push_back(u);
	}

	for (int i = 1; i <= n; i++) {
		dfs(i);
		cnt++;
	}

	for (int i = 0; i < p; i++) {
		int u, v;
		scanf("%d%d", &u, &v);
		if (arr[u] == arr[v]) {
			printf("Yes\n");
		}
		else {
			printf("No\n");
		}
	}
	return 0;
}

最后:

image

posted @ 2026-03-22 21:43  沉睡的猫  阅读(3)  评论(0)    收藏  举报