#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的节点的。
您可以在每次从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
向量中的更改(其中新1的数量)
背景:我是图论的新手,特别是“图割”。请不要太技术和速度。谢谢。 假设我有一个加权无向连通图G=(V,E)。我有一个变量a,它包含一个整数值,我想从图G中删除/裁剪所有权重低于a值的边。 问题1:如果图论中已经存在这一点(我看到了max-cut、min-cut、s-t cut,等等),它怎么称呼? 问题2:我如何使用数学符号正式表达/定义这种方法。 谢谢你的建议。
我有一个未加权有向图G,它可能非常大(数千个节点)。
总结 因此,我有一个有向无环加权图,其中每条边都有一个输入和输出节点,每个节点都有一个ID,我使用一个字典将所有传入的边映射到一个节点的ID,并使用另一个字典对所有传出的边进行同样的操作,这样,当出现节点ID时,我可以在大约O(1)时间内告诉所有传入和传出的边。 要求 我需要能够添加新的随机边(即连接两个随机节点),以保证无论图有多大,它都不会有任何循环。 我试过的 由于我完全控制如何构建我的图,
我想知道什么是实现无向加权图的有效方法。我想在上面执行Prims和Kruskal算法。我知道邻接列表,但这不会浪费内存;为。假设我有两个顶点A和B,由权重为“x”的边连接,所以我需要在邻接列表中添加两个条目: 我是不是漏掉了什么?
A-B-C-D A-B-C-E A-B-C-F 我的想法是,我需要同时使用DFS和BFS,但我不确定这是否有效?
我想在无向图中找到一个强连通分量,即如果我从一个节点开始,那么我将回到节点,并且每个边都被精确地访问一次。 对于有向图,可以用Tarjan算法求强连通分量,但是对于无向图,该怎么办。