图的遍历

图的遍历,对于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
*/

 

posted @ 2018-12-28 10:38  xyee  阅读(130)  评论(0)    收藏  举报