C++邻接表图操作

#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <sstream>
#include <functional>
#include<iomanip>
using namespace std;
typedef struct{
    vector<vector<int>> arcs;//邻接矩阵
    vector<char> vexs;//顶点表
    int vexnum, edgenum;//顶点数和边数
    vector<bool> visited;

}Graph;
int locates(Graph *g, char ch)
{
    int i = 0;
    for (i = 0; i < g->vexnum; i++)
    {
        if (g->vexs[i] == ch)
        {
            break;
        }
    }
    if (i >= g->vexnum)
    {
        return -1;
    }

    return i;
}
void CreateGraph(Graph &G)
{

    cout<<"创建邻接矩阵的无向图:"<<endl;  
    int i,j,k,w;  
    //G5的存储:  
    G.vexnum = 8;
    G.edgenum = 9;
    G.visited=vector<bool>(G.vexnum, false);
    for (i = 0; i < G.vexnum; ++i){
        vector<int> a;
        for (j = 0; j < G.vexnum; ++j) {
            a.push_back(0);
        }
        G.arcs.push_back(a);
    }
    G.vexs.push_back('1');  
    G.vexs.push_back('2');
    G.vexs.push_back('3');
    G.vexs.push_back('4');
    G.vexs.push_back('5');
    G.vexs.push_back('6');
    G.vexs.push_back('7');
    G.vexs.push_back('8');

    G.arcs[0][1] = 1;  
    G.arcs[1][0] = 1;  


    G.arcs[1][3] = 1;  
    G.arcs[3][1] = 1;  

    G.arcs[3][7] = 1;  
    G.arcs[7][3] = 1;  


    G.arcs[7][4] = 1;  
    G.arcs[4][7] = 1;  

    G.arcs[4][1] = 1;  
    G.arcs[1][4] = 1;  

    G.arcs[0][2] = 1;  
    G.arcs[2][0] = 1;  


    G.arcs[2][5] = 1;  
    G.arcs[5][2] = 1;  

    G.arcs[5][6] = 1;  
    G.arcs[6][5] = 1;  

    G.arcs[6][2] = 1;  
    G.arcs[2][6] = 1;  


}

void DFS(Graph &g, int i){

    cout << g.vexs[i]<<" ";
    g.visited[i] = true;
    for (int j = 0; j < g.vexnum; j++){
        if (g.arcs[i][j] == 1 && !g.visited[j]){
            DFS(g, j);
        }
    }

}
void DFSTraverse(Graph &g){//  

    for (int i = 0; i < g.vexnum; i++)
        g.visited[i] = false;
    for (int i = 0; i < g.vexnum; i++)
        if (!g.visited[i]) DFS(g, i); //v未访问过,从vi开始DFS搜索  


}
void BFSTraverse(Graph &g){
    for (int i = 0; i < g.vexnum; i++)
        g.visited[i] = false;
    queue<int> q;
    for (int i = 0; i < g.vexnum; i++){
        if (!g.visited[i]){
            g.visited[i] = true;
            cout << g.vexs[i] << " ";
            q.push(i);
            while (!q.empty()){
                int m = q.front();
                q.pop();
                for (int j = 0; j < g.vexnum; j++){
                    if (g.arcs[m][j] == 1 && !g.visited[j]){
                        g.visited[j] = true;
                        cout << g.vexs[j] << " ";
                        q.push(j);
                    }
                }
            }
        }
    }
}
//打印图
void printGraph(Graph g)
{
    int i, j;
    for (i = 0; i < g.vexnum; i++)
    {
        for (j = 0; j < g.vexnum; j++)
        {
            printf("%d  ", g.arcs[i][j]);
        }
        printf("\n");
    }
}
int main(){
    Graph g;

    //邻接矩阵创建图
    CreateGraph(g);
    printGraph(g);
    BFSTraverse(g);
    DFSTraverse(g);
    return 0;


}

猜你喜欢

转载自blog.csdn.net/guiqulaxi920/article/details/62883542
今日推荐