图的遍历

图的遍历,对于dfs我们在主函数里面判断是否还有未遍历的点,然后dfs搜索,如果是旧点,我门就返回,如果不是我们就标记已搜,然后搜索这个点的邻接点。

这样做的好处就是可以遍历非连通的图,因为我们一个dfs结束的时候可能不能遍历所有的点,所以我们直接判断是否还有新点即可。

对于bfs也是一样,首先将队列置空,做初始化,然后搜索即可。

#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
int AdjMatrix[100][100];
int vis[100];
queue<int> Q;
int n,m,s,e;

void dfs(int p)
{
    if(vis[p])
        return;
    vis[p]=1;
    printf("%3d", p);
    for (int j = 1; j <= n;j++) {
        if (AdjMatrix[p][j]) {
            dfs(j);
        }
    }
}

void bfs()
{
    while (!Q.empty()) {
        int f = Q.front();
        Q.pop();
        for (int i=1;i<=n;i++) {
            if (AdjMatrix[f][i]) {
                if (!vis[i]) {
                    Q.push(i);
                    vis[i] = 1;
                    printf("%3d", i);
                }
            }
        }
    }
}


void enter()
{
    memset(AdjMatrix, 0, sizeof(AdjMatrix));
    memset(vis, 0, sizeof(vis));
    cout << "Please enter the number of the point and the number of the edge." << endl;
    scanf("%d%d", &n, &m);
    printf("Please enter the adjacent point in turn.\n");
    for (int i = 0;i<m;i++) {
        scanf("%d%d", &s, &e);
        AdjMatrix[s][e] = 1;
    }
}

int main()
{
    enter();
    for (int i = 1;i<=n;i++) {
        if (!vis[i]) {
            dfs(i);
        }
    }
    printf("\n");

    enter();
    for (int i=1;i<=n;i++) {
        if (!vis[i]) {
            while (!Q.empty())
                Q.pop();
            Q.push(i);
            vis[i] = 1;
            bfs();
            printf("\n");
        }
    }
    return 0;
}
/*
实验数据(非连通)
5 3
1 2
2 3
4 5
连通图数据
5 4
1 2
2 3
3 4
4 5
*/

 

转载于:https://www.cnblogs.com/xyqxyq/p/10211323.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值