洛谷P1551题解
洛谷P1551题解
题目传送门:https://www.luogu.com.cn/problem/P1551
题目简述:
n个人,m个关系,p个询问,要输入谁和谁之间有亲戚关系,输出给定的两个人之间是否有亲戚关系
题目分析:
思路很显然,用无向图储存人之间的关系,然后进行dfs染色,查询的是否判断色号是否一致即可
- 储存亲戚关系用vector
adj[maxn]来储存,比如a与b,c,d相邻,那么adj[a]就是一个动态数组,里面储存了b,c,d; - 染色:遍历所有人,对每个人进行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;
}
最后:


浙公网安备 33010602011771号