末世苍雪

root@jtahstu.com   Github  

最新碎语:这个M1 MBP, PHP多版本环境装的我极度崩溃, 历时4个小时终于搞定了. 1. brew转不了7.x的环境, 默认只能装8.1, 恶心. 2. Nginx装上了, 但是请求转发不到php-fpm上, 试了各种配置都不行, 删掉Nginx转战Apache, 吐了. 3. 系统自带httpd, brew能装上httpd但搞死启动不了httpd, 只能手动启动和关闭httpd, 无语. 4. 以上问题都解决后, 加上自己写的启动和关闭脚本, 目前能正常跑起来PHP文件了, 开心! 为啥目前没有开源好用的M1 MNMP环境哇, o(≧口≦)o

您的位置:末世苍雪 >算法> 无向图的深度和广度优先遍历 - C++

无向图的深度和广度优先遍历 - C++

无向图的深度和广度优先遍历

算法


本文来自《啊哈!算法》第5章第1节  下载PDF查看 :啊哈算法 - 图的遍历.pdf

需要解决的问题

一个无向图,怎么从深度和广度来遍历这个图,也就是怎么个走法

需要了解和学习的点

  • 图的邻接矩阵存储法(就是一个二维数组
  • 回溯 (这里要理解循环能给递归产生回溯的效果
  • 图的生成树

代码

深度优先遍历


/**
 * 图的深度优先遍历
 * 啊哈算法 P131
 * by jtahstu at 2017-09-14
 */

#include <iostream>
#include <climits>

using namespace std;
int book[101] = {0}, sum, n, m, e[101][101] = {0};

void dfs(int cur) {
    cout << cur << " ";
    sum++;
    if (sum == n)return;
    for (int i = 1; i <= n; i++) {  //循环达到回溯的效果
        if (book[i] == 0 && e[cur][i] == 1) {
            book[i] = 1;
            dfs(i);
        }
    }
    return;
}

int main(int argc, const char *argv[]) {
    cin >> n >> m;  //n个节点,m条边
    for (int i = 1; i <= n; i++)    //初始化
        for (int j = 1; j <= n; j++) {
            if (i == j)
                e[i][j] = 0;
            else
                e[i][j] = INT_MAX;
        }
    int a, b;
    for (int k = 1; k <= m; k++) {  //矩阵表示
        cin >> a >> b;
        e[a][b] = 1;
        e[b][a] = 1;
    }
    book[1] = 1;
    dfs(1);

    return 0;
}
/**
5 4
3 2
3 4
2 5
2 1

5 5
1 2
1 3
1 5
2 4
3 5
*/


广度优先遍历


/**
 * 图的广度优先遍历
 * 啊哈算法 P134
 * by jtahstu at 2017-09-14
 */

#include <iostream>
#include <climits>

using namespace std;

int main() {
    int n, m, a, b, cur, book[101] = {0}, e[101][101] = {0};
    int que[101], head = 1, tail = 1;

    cin >> n >> m;  //n个节点,m条边
    for (int i = 1; i <= n; i++)   //初始化
        for (int j = 1; j <= n; j++) {
            if (i == j)
                e[i][j] = 0;
            else
                e[i][j] = INT_MAX;
        }
    for (int i = 1; i <= m; i++) {  //图的矩阵表示
        cin >> a >> b;
        e[a][b] = 1;
        e[b][a] = 1;
    }

    que[1] = 1;
    tail++;
    book[1] = 1;  //走过的标记为1
    while (head < tail) {
        cur = que[head];
        for (int i = 1; i <= n; i++) { //当前顶点往下的所有可能都存到队列中去
            if (book[i] == 0 && e[cur][i] == 1) {
                que[tail] = i;
                tail++;
            }
            if (tail > n)
                break;
        }
        head++; //表示当前点遍历结束,下个点
    }

    for (int i = 1; i <= n; i++) {
        cout << que[i] << " ";
    }

    return 0;
}

/**
5 4
1 3
1 5
3 2
5 4
 */


---

本文章采用 知识共享署名2.5中国大陆许可协议 进行许可,转载必须注明作者和本文链接。

---

二维码加载中...

扫一扫移动端访问O(∩_∩)O

发表评论

92 + 16 =
路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交
正在加载中……