知识点
连通分量:连通性未知的图G,其极大连通子图即为G的连通分量。
问题链接
ALDS1_11_D:Connected Components
问题内容
求出两个人能不能通过他们的朋友互相认识对方。
思路
用广度优先搜索或者深度优先搜索计算全部人两两之间能不能称为朋友。利用连通分量的性质去将每个不同分量标记为不同的数字即可。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <vector>
using namespace std;
const int maxx = 100010;
int n, m;
int u, num, v;
int flag[maxx];
int color[maxx];
vector<int> G[maxx];
int c = 1;
void dfs(int t) {
stack<int>s;
s.push(t);
color[t] = c;
while (!s.empty()) {
int u = s.top(); s.pop();
int len = G[u].size();
for (int i = 0; i < len; i++) {
int v = G[u][i];
if (flag[v] == 0) {
color[v] = c;
flag[v] = 1;
s.push(v);
}
}
}
}
int main()
{
int q;
memset(flag, 0, sizeof(flag));
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d %d", &u, &v);
//将顶点v添加到G[u]数组中
G[u].push_back(v);
G[v].push_back(u);
}
for (int i = 0; i < n; i++) {
if (flag[i] == 0) {
dfs(i);
c++;
}
}
scanf("%d", &q);
for (int i = 0; i < q; i++) {
scanf("%d %d", &u, &v);
if (color[u] == color[v]) {
printf("yes\n");
}
else {
printf("no\n");
}
}
return 0;
}