一棵树就是拥有n个结点,n-1条边的联通无向图
/*
* @Descripttion:
* @version:
* @Author: Nice_try
* @Date: 2020-06-03 17:06:39
* @LastEditors: Nice_try
* @LastEditTime: 2020-06-03 18:03:34
*/
#include<iostream>
#include<queue>
using namespace std;
//判断无向图是一棵树的条件是 结点数为n 具有n-1条边的连通图
//使用邻接矩阵
bool road[101][101];//两节点之间是否有边存在
int n, m;//结点数 边数
bool flag[101];//判断是否在一个连通块中
int num;//对所遍历的连通块结点计数
queue<int> q;
void dfs(int node)
{
for (int i = 1; i <= n;i++)
if(road[node][i]==1&&flag[i]==0)
flag[i] = 1, num++, dfs(i);
}
void bfs(int st)
{
q.push(st);
int cur;
while(!q.empty())
{
cur = q.front();
q.pop();
for (int i = 1; i <= n;i++)
{
if(road[cur][i]&&flag[i]==0)
{
flag[i] = 1;
num++;
q.push(i);
}
}
}
return;
}
int init_dfs()
{
for (int i = 1; i <= n; i++)
flag[i] = 0;
num = 0;
cin >> n >> m;
for (int i = 1; i <= n;i++)
for (int j = 1; j <= n;j++)
road[i][j] = 0;
if (m != n - 1)
return 0;
int x, y;
for (int i = 1; i <= m;i++)
cin >> x >> y, road[x][y] = road[y][x] = 1;
flag[1] = 1;
num++;
dfs(1);
if (num == n)
return 1;
else
return 0;
}
int init_bfs()
{
for (int i = 1; i <= n;i++)
flag[i] = 0;
cin >> n >> m;
num = 0;
for (int i = 1; i <= n;i++)
for (int j = 1; j <= n;j++)
road[i][j] = 0;
if (m != n - 1)
return 0;
int x, y;
for (int i = 1; i <= m; i++)
cin >> x >> y, road[x][y] = road[y][x] = 1;
flag[1] = 1;
num++;
bfs(1);
if (num == n)
return 1;
else
return 0;
}
int main()
{
cout << "方法一(bfs遍历):\n";
if(init_bfs())
cout << "给定的无向图是一棵树\n";
else
cout << "给定的无向图不是一棵树\n";
cout << "方法二(dfs遍历):\n";
if (init_dfs())
cout<< "给定的无向图是一棵树\n";
else cout << "给定的无向图不是一棵树\n";
system("pause");
return 0;
}