无向图的邻接矩阵法,BFS

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include"myQueue.h"
#define MaxVerTexNum 100
#define elemType char
typedef struct MGraph {
    elemType Vex[MaxVerTexNum];
    int Edge[MaxVerTexNum][MaxVerTexNum];
    int vexNum, arcNum;
}MGraph;
//对图进行初始化 
void initGraph(MGraph* grah) {
    for (int i = 0;i < MaxVerTexNum;i++) {
        for (int j = 0;j < MaxVerTexNum;j++) {
            grah->Edge[i][j] = INT_MAX;
        }
        grah->Vex[i] = 0;
    }
    grah->vexNum = 0;
    grah->arcNum = 0;
}
//在图G中插入顶点x
bool InsertVertex(MGraph* G, elemType x) {
    if (G->Vex[x - 'A'] != 0) {
        return false;
    }
    G->Vex[x - 'A'] = x;
    return true;
}
//在图G中删除顶点x
void DeleteVertex(MGraph* G, elemType x) {
    G->Vex[x - 'A'] = 0;
}
//在图G中给x,y添加一条边 
bool AddEdge(MGraph* G, elemType x, elemType y, int value) {
    if (G->Edge[x - 'A'][y - 'A'] != INT_MAX) {
        return false;
    }
    G->Edge[x - 'A'][y - 'A'] = value;
    G->Edge[y - 'A'][x - 'A'] = value;
    return true;
}
//删除图G中x到y这条边
void RemoveEdge(MGraph* G, elemType x, elemType y) {
    G->Edge[x - 'A'][y - 'A'] = INT_MAX;
    G->Edge[y - 'A'][x - 'A'] = INT_MAX;
}
//求图中顶点x的第一个邻接点 
elemType FirstNeighbor(MGraph* G, elemType x) {
    for (int i = 0;i < MaxVerTexNum;i++) {
        if (G->Edge[x - 'A'][i] != INT_MAX) {
            return 'A' + i;
        }
    }
    return 0;
}
//假设y是x的邻接点,返回除y之外顶点x的下一个顶点号
int NextNeighbor(MGraph* G, elemType x, elemType y) {
    for (int i = y-'A';i < MaxVerTexNum;i++) {
        if (G->Edge[x - 'A'][i] != INT_MAX && y - 'A' != i) {
            return 'A' + i;
        }
    }
    return 0;
}
//获取图中x到y的权值
int getEdgeValue(MGraph* G, elemType x, elemType y) {
    return G->Edge[x - 'A'][y - 'A'];
}
int visited[MaxVerTexNum] = { 0 };
void BFS(MGraph* G, elemType x) {
    Queue Q;
    initQueue(&Q);//初始化辅助队列 
    pushInQueue(&Q, x);//从x开始遍历,将x压入队列 
    visited[x - 'A'] = 1;//该节点已经被访问 
    elemType temp;
    while (!isEmptyQueue(&Q)) {
        popQueue(&Q, &temp);//出队并访问该节点 
        printf("%c ", temp);
        for (elemType w = FirstNeighbor(G, temp);w != 0;w = NextNeighbor(G, temp, w)) {//将该节点的邻接点都入队 
            if (visited[w - 'A'] == 0) {//确保其没有被访问,避免出现回路 
                pushInQueue(&Q, w);//入队 
                visited[w - 'A'] = 1;//并标记为已访问 
            }
        }
    }

    destory(&Q);
}
int main() {
    MGraph G;
    initGraph(&G);
    InsertVertex(&G, 'A');
    InsertVertex(&G, 'B');
    InsertVertex(&G, 'C');
    InsertVertex(&G, 'D');
    InsertVertex(&G, 'E');
    InsertVertex(&G, 'F');

    AddEdge(&G, 'A', 'B', 1);
    AddEdge(&G, 'A', 'D', 1);
    AddEdge(&G, 'A', 'E', 1);
    AddEdge(&G, 'B', 'C', 1);
    AddEdge(&G, 'B', 'D', 1);
    AddEdge(&G, 'C', 'F', 1);
    BFS(&G, 'A');
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值