图的创建,遍历

来源:互联网 发布:php远程ftp上传图片 编辑:程序博客网 时间:2024/06/10 14:29

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

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;}