对于一个图而言,它的极大连通子图就是它的连通分量。如果包含G’的图只有G,那么G’就是G的极大连通子图。
连通分量可以通过深度优先搜索或者广度优先搜索来寻找。
题目:ALDS1_11_D
方法就是以未访问的顶点为起点来进行搜索,每次开始从头进行搜索,搜索到的节点都属于同一个极大连通子图,也就是整个图的一个连通分量。
代码实现比较简单,我是用dfs做的
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;
const int NIL = -1;
vector<int> G[100005];
int n, m;
int color[100005];
void dfs(int r, int id)
{
stack<int> s;
s.push(r);
color[r] = id;
while (!s.empty())
{
int u = s.top();
s.pop();
for (int x : G[u])
{
if (color[x] == NIL)
{
s.push(x);
color[x] = id;
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 0; i < m; ++i)
{
int s, t;
cin >> s >> t;
G[s].push_back(t);
G[t].push_back(s);
}
int id = 1;
for (int i = 0; i < n; ++i)
color[i] = NIL;
for (int u = 0; u < n; ++u)
{
if (color[u] == NIL)
{
dfs(u, id++);
}
}
int q;
cin >> q;
for (int i = 0; i < q; ++i)
{
int s, t;
cin >> s >> t;
if (color[s] == color[t])
cout << "yes" << endl;
else
cout << "no" << endl;
}
}
转载请注明出处:https://www.longjin666.top/?p=739
欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~