无向图的深度遍历
#include<iostream>
#include<fstream>
using namespace std;
int e[100][100]; //无向图图采用邻接矩阵表示,一般的图采用数组,稀疏图可采用vector动态表示节约资源
int book[100]; //采用book数组记录节点是否已经访问过
int n,m; //n个顶点,m条边
void dfs(int cur)
{
cout<<cur<<" ";
for(int i=1;i<=n;i++)
{
if(e[cur][i]==1&&book[i]==0)
{
book[i]=1;
dfs(i);
}
}
}
int main()
{
fstream f("1.txt");
//f>>n>>m;
cin>>n>>m;
//初始化n维数组
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
e[i][j]=0;
else
e[i][j]=99;
}
}
//输入图的信息
int x,y;
for(int i=1;i<=m;i++)
{
//f>>x>>y;
cin>>x>>y;
e[x][y]=1;
e[y][x]=1;
}
memset(book,0,sizeof(int));
int count=0;
for(int i=1;i<=n;i++)
{
if(book[i]==0)
{
book[i]=1;
dfs(i);
count++;
cout<<endl;
}
}
cout<<"该图共有"<<count<<"个连通分量"<<endl;
}
//记忆技巧,主循环里面三个for,前两个用来初始化图,后一个遍历每个连通分量
//关于dfs只需维护一个cur参数即可,对于点V来说,只要遍历它的周围即可(即一个for即可)