• 图的广度优先遍历(bfs)


    广度优先遍历:

    1.将起点s 放入队列Q(访问)

    2.只要Q不为空,就循环执行下列处理

    (1)从Q取出顶点u 进行访问(访问结束)

    (2)将与u 相邻的未访问顶点v 放入Q, 同时将d[v]更新为d[u] + 1

    主要变量

    M[n][n]邻接矩阵,如果存在顶点i到顶点j 的边,则M[i][j] 为true
    Queue Q记录下一个待访问顶点的队列
    d[n]

    将起点s 到个顶点i的最短距离记录在d[i]中。

    s无法到达i 时d[i] 为INFTY(极大值)

     1 #include<iostream>
     2 #include<queue>
     3 using namespace std;
     4 
     5 static const int N = 100;
     6 static const int INFTY = (1 << 21);
     7 
     8 int n, M[N][N];
     9 int d[N];//用来存储v到起始顶点的距离 
    10 
    11 void bfs(int s) {
    12     queue <int> q;
    13     q.push(s);//起始顶点 入队 
    14     //设置初始值, 通过判断距离大小来明白该顶点是否被访问 
    15     for(int i = 0; i < n; i++)    d[i] = INFTY;
    16     d[s] = 0;//初始值为0 
    17     int u;
    18     while( !q.empty() ) {
    19         u = q.front();
    20         q.pop();
    21         //检索与该顶点有连接的顶点,并入队 
    22         for(int v = 0; v < n; v++) {
    23             if(M[u][v] = 0)    continue;
    24             //如果该顶点被访问过 
    25             if(d[v] != INFTY)    continue;
    26             //该顶点与起始顶点的距离等于,上一个顶点与起始顶点距离加1 
    27             d[v] = d[u] + 1;
    28             q.push(v);
    29         }
    30     }
    31     //输出,若未被访问则输出-1 
    32     for(int i = 0; i < n; i++) {
    33         cout << i + 1 << " " << ( (d[i] == INFTY) ? (-1) : d[i] ) << endl;
    34     }
    35 }
    36 
    37 int main() {
    38     int u, k, v;
    39     cin >> n;
    40     //初始化 
    41     for(int i = 0; i < n; i++) {
    42         for(int j = 0; j < n; j++) 
    43             M[i][j] = 0;
    44     }
    45     //输入数据构建邻接矩阵 
    46     for(int i = 0; i < n; i++) {
    47         cin >> u >> k;
    48         u--;
    49         for(int j = 0; j < k; j++) {
    50             cin >> v; 
    51             v--;
    52             M[u][v] = 1;
    53         }
    54     }
    55     //广度优先遍历 
    56     bfs(0);
    57     
    58     return 0;
    59 }
    60 
    61 /*
    62 4
    63 1 2 2 4
    64 2 1 4
    65 3 0 
    66 4 1 3
    67 */
  • 相关阅读:
    64位系统上32位进程拷贝文件到System32目录时的重定向
    mac osx上为qt应用生成debug symbol
    c++正则表达式模板库GRETA的使用
    win驱动安装记录
    QWidget标题栏双击事件
    mac上的应用提权
    js初级DOM&BOM知识点总结
    js数组遍历
    angular.js小知识总结
    Node.js
  • 原文地址:https://www.cnblogs.com/mr-wei977955490/p/15367601.html
Copyright © 2020-2023  润新知