c++ - 计算无向未加权图的每个连接部分中的节点数

标签 c++ graph stl undirected-graph

我是 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;
}

但是我们如何统计每个组件中的节点总数呢?

For example: In this graph, see image there are 3 connected components, with no. of nodes being 3, 2 , and 1 respectively.

最佳答案

您可以在每次从 main() 调用 DFS 时维护一个虚拟变量 count

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";
  }        
}

或者您可以在每次从 main()< 调用 DFS() 后引用 visited vector 的变化(其中新 1 的数量)/

关于c++ - 计算无向未加权图的每个连接部分中的节点数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50853486/

相关文章:

c++ - 将 shared_ptr 与通用注册表或共享对象存储一起使用......或不

c++ - 将 FLOAT 值插入 mysql 表

android - Pou连接博弈算法

javascript - 如何检测 D3 中条形图上指针下方最近的矩形?

从加权图中找到第二好的最小生成树的算法

c++ - 如何以高效快捷的方式为数字添加前缀和删除?

c++ - 如何为 map 创建自己的比较器?

c++ - 带 vector 的斐波那契数列

c++ - 在 LLVM 中启用循环反转的任何选项?

时间:2019-03-08 标签:c++fgetsformatchar*