计算无向未加权图的每个连接部分中的节点数
Count number of nodes in each connected part of an undirected unweighted graph
我是STL C++新手,最近开始了图论。 参考 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。
您可以在每次调用DFS
时维护一个虚拟变量count
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";
}
}
或者你可以参考每次从main()
调用DFS()
后visited
向量(其中新 1 的数量(的变化
您可以维护一个全局变量no_of_nodes
该变量在每个组件的 DFS 开始时设置为零,并在访问该组件中的每个节点时递增 1。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int connected=0, temp1, temp2,n, p;
int no_of_nodes=0;
void DFS(int start, vector<int> v[],vector<int> &visited) {
visited[start] = 1;
no_of_nodes++;
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;
vector<int>nodes;
for(int i=1;i<=n;++i) {
if(visited[i] == 0 ) {
connected++;
no_of_nodes=0;
DFS(i,v,visited);
nodes.push_back(no_of_nodes);
}
}
cout<<connected<<endl;
return 0;
}
相关文章:
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 将头连接到链表中的其他节点
- C++ 链表合并排序的实现在连接 1 个以上节点的子列表时失败
- 如何使用指针连接两种不同的节点类型(结构)?
- 节点MCU上的持久https连接
- 查找树(不属于任何特定类型的简单连接树)中两个节点之间的路径
- 如何将这些节点连接为有向图
- Linux复制文件连接到节点JS / Python / C / C 之后
- 连接二叉树中同一级别的节点
- 如何将C++应用程序与节点.js服务器连接以获取 JSON 数据
- 检查节点是否使用Maya API连接到特定的插头
- 提升图形库:防止 DFS 访问未连接的节点
- 连接具有n个节点的图中k个节点的最小路径
- 创建一组随机连接的节点
- DFS:如何在c++中表示连接组件的节点
- 链表,对将节点添加到链表头部的函数感到困惑
- 将两个传感器dht11和dht22连接到同一个节点模块esp-12e
- 动态连接 QML 中图形的节点 la Pd 或 Max(又名"patching"接口)
- 社交图中 2 个节点之间的连接程度