一棵樹就是擁有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;
}