图的创建,遍历

这里是根据老师给的参考代码重新写了一个关于图的遍历。

DFS使用递归,BFS使用队列。

代码如下:

#include<cstdio>
#include<cstdlib>
using namespace std;
const int maxn = 100;
typedef struct{
    char vexs[maxn];      //顶点表 
    int edges[maxn][maxn];//邻接矩阵 
    int n, e;             //分别为顶点数和边数 
}MGraph;
int visited[maxn];

/*建立邻接矩阵,并初始化*/
void CreateMGraph(MGraph &G)
{
    char a;
    printf("输入顶点数(n)和边数(e):");
    scanf("%d%d", &G.n, &G.e);
    getchar();
    for(int i=0; i<G.n; i++)
    {
        scanf("%c", &a);
        G.vexs[i] = a;
    }
    for(int i=0; i<G.n; i++)
    {
        visited[i]= 0;//初始化visited
        for(int j=0; j<G.n; j++)
        {
            G.edges[i][j] = 0;
        }
    }
    int s,t;
    //建图
    for(int i=0; i<G.e; i++)
    {
        scanf("%d%d", &s, &t);
        G.edges[s][t] = 1;
        G.edges[t][s] = 1;
    } 
} 

/*对每个联通分量进行深度优先遍历*/
void DFSM(MGraph G, int i)
{
    printf("%c",G.vexs[i]);
    for(int j=0; j<G.n; j++)
    {
        if(G.edges[i][j] && !visited[j])
        {
            visited[j] = 1;
            DFSM(G, j);
        }
    }
}

/*对整个图进行DFS*/ 
void DFS(MGraph G)
{
    for(int i=0; i<G.n; i++)
    {
        if(!visited[i])
        {//对于每个连通分量进行DFSM
            visited[i] = 1;
            DFSM(G, i);
        }
    }
}

/*顺序队列,即用数组表示队列*/
void BFS(MGraph G, int k)
{
    int f=0, r=0;
    int q[maxn];
    for(int i=0; i<=G.n; i++)
    {
        visited[i] = 0;
        q[i] = -1;
    }
    printf("%c", G.vexs[k]);
    visited[k] = 1;
    q[r] = k;
    while(q[f] != -1)
    {
        int u = q[f];
        f += 1;
        for(int v=0; v<G.n; v++)
        {
            if(G.edges[u][v] && !visited[v])
            {
                printf("%c", G.vexs[v]);
                visited[v] = 1;
                r += 1;
                q[r] = v; 
            }
        }
    }
} 
int main()
{
    MGraph G;
    CreateMGraph(G);
    DFS(G);
    printf("\n");
    BFS(G, 3);
    return 0;
}
    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/karry_zzj/article/details/73412048
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞