可以不用vector再写一次吗?
时间: 2023-08-05 09:26:41 浏览: 78
可以的,下面是不使用vector的C++算法实现:
```C++
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=100;
int G[maxn][maxn],vis[maxn],n,m,cnt=0;//G为邻接矩阵,vis数组记录节点是否被访问,cnt记录生成树中的边数
bool is_tree=true;//标记是否为生成树
void dfs(int u,int p)//p为u的父节点
{
vis[u]=1;
for(int i=1;i<=n;i++)
{
if(G[u][i])
{
int v=i;
if(!vis[v])//如果v未被访问过,表示(u,v)为树边
{
cnt++;
dfs(v,u);
}
else if(v!=p)//如果v被访问了,并且v不是u的父节点,则表示(u,v)为回溯边
{
is_tree=false;
}
}
}
}
int main()
{
cin>>n>>m;//n为节点数,m为边数
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
for (int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
G[u][v]=G[v][u]=1;//无向图,需要建立双向边
}
dfs(1,-1);//从节点1开始深度优先搜索
if(cnt!=n-1||!is_tree)//如果生成树中的边数不是n-1条,或者出现了回溯边,则不是一棵生成树
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
return 0;
}
```
该算法的时间复杂度为O(n^2),其中n为节点数。
阅读全文