你可以给出无向图深度优先生成树的C++的算法吗?
时间: 2024-02-28 09:57:37 浏览: 66
图的深度优先搜索,广度优先搜索,最小生成树算法,包括kruskal、prim算法的C++实现代码
当然可以,下面是无向图深度优先生成树的C++算法实现:
```C++
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=100;
vector<int>G[maxn];
bool vis[maxn],is_tree=true;
int cnt=0;//记录生成树中的边数
void dfs(int u,int p)
{
vis[u]=true;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(!vis[v])
{
cnt++;//记录生成树中的边数
dfs(v,u);
}
else if(v!=p)//如果v被访问了,并且v不是u的父节点,则说明出现了回溯边,不是一棵生成树
{
is_tree=false;
}
}
}
int main()
{
int n,m;
cin>>n>>m;//n为节点数,m为边数
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
G[u].push_back(v);//无向图,需要建立双向边
G[v].push_back(u);
}
memset(vis,false,sizeof(vis));
dfs(1,-1);//从节点1开始深度优先搜索
if(cnt!=n-1||!is_tree)//如果生成树中的边数不是n-1条,或者出现了回溯边,则不是一棵生成树
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
return 0;
}
```
该算法的时间复杂度为O(n+m),其中n为节点数,m为边数。
阅读全文