图的深度遍历和广度遍历(邻接矩阵)

 

 

#include<iostream>
using namespace std;

#define MAXSIZE 9 /* 存储空间初始分配量 */
#define MAXEDGE 15
#define MAXVEX 9

typedef struct //建立图这个结构体
{
    char vexs[MAXVEX];//顶点表
    int arc[MAXVEX][MAXVEX];//建立矩阵
    int numVertexes, numEdges;//图中当前顶点数和边数
}MGraph;

typedef struct//建立循环队列
{
    int data[MAXSIZE];
    int front;
    int rear;
}Queue;

bool InitQueue(Queue* Q)//初始化一个空队列
{
    Q->front = 0;
    Q->rear = 0;
    return true;
}

bool QueueEmpty(Queue Q)//判断队列是否为空
{
    if (Q.front == Q.rear)//如果队列为空
        return true;
    return false;
}

bool InQueue(Queue* Q, int e)//入队
{
    if ((Q->rear + 1) % MAXSIZE == Q->front)//如果队满,插入失败
        return false;
    Q->data[Q->rear + 1] = e;
    Q->rear = (Q->rear + 1) % MAXSIZE;//插入成功
    return true;
}

bool DeQueue(Queue* Q, int* e)//出队
{
    if (Q->front == Q->rear)
        return false;
    *e = Q->data[Q->front];
    Q->front = (Q->front + 1) % MAXSIZE;
    return  true;
}

void GreatMGraph(MGraph* G)
{
    G->numEdges = 15;
    G->numVertexes = 9;
    
    //读取顶点信息
    G->vexs[0]='A';
    G->vexs[1]='B';
    G->vexs[2]='C';
    G->vexs[3]='D';
    G->vexs[4]='E';
    G->vexs[5]='F';
    G->vexs[6]='G';
    G->vexs[7]='H';
    G->vexs[8]='I';
    
    //初始化图
    for (int i = 0; i < G->numVertexes; i++)
        for (int j = 0; j < G->numVertexes; j++)
            G->arc[i][j] = 0;

    /*把能到达的路经赋值为1,此代码的任务是完成深度优先遍历,
    所有我规定A--B中,只能A->B*/
    G->arc[0][1] = 1;
    G->arc[0][5] = 1;
    
    G->arc[1][2] = 1;
    G->arc[1][6] = 1;
    G->arc[1][8] = 1;
    
    G->arc[2][3] = 1;
    G->arc[2][8] = 1;
    
    G->arc[3][4] = 1;
    G->arc[3][6] = 1;
    G->arc[3][7] = 1;
    
    G->arc[4][5] = 1;
    G->arc[4][7] = 1;
    
    G->arc[5][6] = 1;
    
    G->arc[6][7] = 1;

    for (int i = 0; i < G->numVertexes; i++)
    {
        for (int j = i; j < G->numVertexes; j++)
        {
            G->arc[j][i] = G->arc[i][j];
        }
    }

}

int visited[MAXVEX];
//邻接矩阵深度优先递归算法
void DFS(MGraph G, int i)
{
    int j;
    visited[i] = 1;//访问后改为1
    printf("%c", G.vexs[i]);//打印顶点,也可做其它操作;
    for (j = 0; j < G.numVertexes; j++)
    {
        if (G.arc[i][j] == 1 && !visited[j])
            DFS(G, j);
    }
}
//邻接矩阵的深度遍历操作
void DFSTraverse(MGraph G)
{
    for (int i = 0; i < G.numVertexes; i++)
        visited[i] = 0; /* 初始所有顶点状态都是未访问过状态 */
    for (int j = 0; j < G.numVertexes; j++)
    {
        if (!visited[j])
            DFS(G, j);
    }
}

void BFSTraverse(MGraph G)
{
    Queue Q;
    InitQueue(&Q);
    for (int i = 0; i < G.numVertexes; i++)
        visited[i] = 0; /* 初始所有顶点状态都是未访问过状态 */
    for (int i = 0; i < G.numVertexes; i++)
    {
        if (!visited[i])
        {
            visited[i] = 1;
            printf("%c", G.vexs[i]);
            InQueue (&Q, i);
            while (!QueueEmpty(Q))
            {
                DeQueue(&Q, &i);
                for (int j = 0; j < G.numVertexes; j++)
                {
                    if (G.arc[i][j] == 1 && !visited[j])
                    {
                        visited[j] = 1;
                        printf("%c", G.vexs[j]);
                        InQueue(&Q, j);
                    }
                }
            }
        }
    }
}

int main()
{
    MGraph G;
    GreatMGraph(&G);
    cout << "深度遍历结果:";
    DFSTraverse(G);
    cout <<endl<< "广度遍历结果:";
    BFSTraverse(G);
    return 0;
}

广度遍历出了大问题,没找到错误,但是思想还是没问题的。

 

posted @ 2022-02-16 10:41  Grit_L。  阅读(130)  评论(0编辑  收藏  举报