zoukankan      html  css  js  c++  java
  • BFS(邻接矩阵表示)

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <queue>
    using namespace std;
    
    #define VERTEX_NUM 8
    
    bool visited[VERTEX_NUM + 1];            // 访问标志数组(备忘表)
    
    int FirstAdjVex(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1], int v)
    {
        for (int j = 1; j <= VERTEX_NUM; j++) {
            if (G[v][j] == 1)
                return j;
        }
        cout << "该点是孤立点" << endl;        // 连通图则不会到这一步
        return -1;
    }
    
    int NextAdjVex(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1], int v, int w)
    {
        for (int j = w + 1; j <= VERTEX_NUM; j++) {
            if (G[v][j] == 1)
                return j;
        }
        return -1;
    }
    
    void BFSTraverse(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1])
    {
        // 按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组visited。
        int v;
        int w;
        queue<int> Q;
        int u;
        for (v = 1; v <= VERTEX_NUM; ++v)
            visited[v] = false;
        for (v = 1; v <= VERTEX_NUM; ++v) {
            if (!visited[v]) {                    // v尚未访问
                visited[v] = true;
                cout << v << endl;
                Q.push(v);
                while (!Q.empty()) {
                    u = Q.front();
                    Q.pop();                    // 队头元素出队并置为u
                    for (w = FirstAdjVex(G, u); w >= 0; w = NextAdjVex(G, u, w)) {
                        if (!visited[w]) {        // u的尚未访问的邻接顶点w入队列Q
                            visited[w] = true;
                            cout << w << endl;
                            Q.push(w);
                        }
                    }
                }
            }
        }
    }
    
    void CreatAdjMatrixGraph(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1])
    {
        int a;
        int b;
        while (cin >> a >> b, !(a == 0 && b == 0)) {    //以0 0作为输入结束
            G[a][b] = 1;
            G[b][a] = 1;
        }
    }
    
    void Display(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1])
    {
        for (int i = 1; i <= VERTEX_NUM; i++) {            // 输出邻接矩阵
            for (int j = 1; j <= VERTEX_NUM; j++) {
                cout << G[i][j] << ' ';
            }
            cout << endl;
        }
    }
    
    int main(int argc, char **argv)
    {
        freopen("cin.txt", "r", stdin);
        bool G[VERTEX_NUM + 1][VERTEX_NUM + 1] = {0};
    
        CreatAdjMatrixGraph(G);
    
        Display(G);
    
        BFSTraverse(G);
    
        return 0;
    }
    
    /* cin.txt:
    1 2
    2 4
    2 5
    8 4
    8 5
    1 3
    3 6
    3 7
    6 7
    0 0
    */

    运行结果:

  • 相关阅读:
    Attributes in C#
    asp.net C# 时间格式大全
    UVA 10518 How Many Calls?
    UVA 10303 How Many Trees?
    UVA 991 Safe Salutations
    UVA 10862 Connect the Cable Wires
    UVA 10417 Gift Exchanging
    UVA 10229 Modular Fibonacci
    UVA 10079 Pizza Cutting
    UVA 10334 Ray Through Glasses
  • 原文地址:https://www.cnblogs.com/jjtx/p/2551575.html
Copyright © 2011-2022 走看看