C++邻接表图操作

来源:互联网 发布:淘宝买花苗 编辑:程序博客网 时间:2024/05/29 15:59
#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;}
0 0