c++ - 计算无向无权图的每个连接部分中的节点数
问题描述
我是 C++ STL 的新手,最近开始学习图论。参考https://www.geeksforgeeks.org/connected-components-in-an-undirected-graph/后,我可以使用 DFS 计算无向、未加权图中的连接组件数:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int connected=0, temp1, temp2,n, p;
void DFS(int start, vector<int> v[],vector<int> &visited) {
visited[start] = 1;
for(int i= 0; i<v[start].size(); ++i) {
if(visited[v[start][i]] == 0)
DFS(v[start][i], v, visited);
}
}
int main() {
cin>>n>>p; // number of vertices and edges
vector<int> v[n+1], visited(n+1,0);
for(int i=0; i<p; ++i) {
cin>>temp1>>temp2;
v[temp1].push_back(temp2);
v[temp2].push_back(temp1);
}
connected = 0;
for(int i=1;i<=n;++i) {
if(visited[i] == 0 ) {
connected++;
DFS(i,v,visited);
}
}
cout<<connected<<endl;
return 0;
}
但是我们如何计算每个组件中的节点总数呢?
例如:在此图中,请参见图像有 3 个连接组件,没有。节点分别为 3、2 和 1。
解决方案
count
您可以在每次调用DFS
from时维护一个虚拟变量main()
void DFS(int start, vector<int> v[],vector<int> &visited, int &count)
{
visited[start] = 1;
count++;
for(int i= 0; i<v[start].size(); ++i)
{
if(visited[v[start][i]] == 0)
DFS(v[start][i], v, visited);
}
}
和
for(int i=1;i<=n;++i)
{
if(visited[i] == 0 )
{
connected++;
int count=0;
DFS(i,v,visited,count);
cout<<"This component has "<<count<<" nodes"<<"\n";
}
}
或者您可以visited
在每次调用DFS()
from后参考向量的变化(其中的新 1 的数量)main()
推荐阅读
- mysql - MySQL 在整个约束中检查另一个表中的 ENUM 列
- python - TypeError:('关键字参数不理解:','dim_ordering')
- c# - 如何将列表项与图标对齐?
- javascript - 为什么我在闪烁的字符周围有边框?
- google-tag-manager - 我可以将 Google 跟踪代码管理器与新的 Google 协作平台一起使用吗?
- javascript - 为父元素触发“focusout”(或类似的)
- laravel-7 - 在多个项目之间共享单个 jwt 令牌以进行身份验证
- c# - WPF Grid Panel.ZIndex 设置为 1 在另一个窗口的情况下不起作用
- java - 尝试一些更改并回滚到以前的状态以防 Java 失败
- manim - ManimGL 错误...在 example_scenes 的 Graphscene 中未渲染轴