dfs&bfs判斷無向圖是否是一棵樹

一棵樹就是擁有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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章