如果再不用memset可以写一次吗?
时间: 2023-08-10 19:24:45 浏览: 72
可以的,可以使用for循环来初始化数组。下面是不使用memset的C++算法实现:
```C++
#include<iostream>
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为边数
for(int i=1;i<=n;i++)//初始化邻接矩阵和vis数组
{
for(int j=1;j<=n;j++)
{
G[i][j]=0;
}
vis[i]=0;
}
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为节点数。
阅读全文