图的广度优先遍历

#include<iostream>
using namespace std;
#define MaxSize 100
typedef struct {
    int* base;
    int front;
    int rear;
}Seq;//队列
int  Init(Seq &L) {
    //初始化队列
    L.base = new int[MaxSize];
    L.rear = L.front = 0;
    return 1;
}
int Enter(Seq &L, int m) {
    //入队列
    if ((L.rear + 1) % MaxSize == L.front) {
        cout << "队列已满";
        return 0;
    }
    L.base[L.rear] = m;
    L.rear = (L.rear + 1) % MaxSize;
    return 1;
}
int Out(Seq &L, int &m) {
    //出队列
    if (L.rear == L.front) {
        cout << "队列为空";
        return 0;
    }
    m = L.base[L.front];
    L.front = (L.front + 1) % MaxSize;
    return 1;
}
int Judge(Seq L) {
    if (L.front == L.rear)
        return 0;
    return 1;
}
#define MAXNUM 100
char visited2[MAXNUM];
typedef struct {
    char vexs[MAXNUM];
    int arcs[MAXNUM][MAXNUM];
    int vexnum,arcnum;
}AMGraph;
int LocateVex(AMGraph G, char v) {
    for (int i = 0;i < G.vexnum;i++) {
        if (G.vexs[i] == v) return i;
    }
    return -1;
}
int CreateUNG(AMGraph &G) { //创建无向图
    char v1,v2;
    cout << "请输入顶点数和边数:";
    cin >> G.vexnum >> G.arcnum;

    cout << "请依次输入顶点:";
    for (int i = 0; i < G.vexnum; i++)cin >> G.vexs[i];

    for (int j = 0; j < G.vexnum; j++)
        for (int i = 0; i < G.vexnum; i++)
            G.arcs[j][i] = 0;         //初始化邻接矩阵
    cout << "请依次输入邻接边:" << endl;
    for (int k = 0; k < G.arcnum; k++) {
        cin >> v1 >> v2;
        int i = LocateVex(G, v1);
        int j = LocateVex(G, v2);
        G.arcs[i][j] = 1;
        G.arcs[j][i] = 1;
    }
    return 1;
}
void BFT_AM(AMGraph G, int i) {
    cout << G.vexs[i];
    visited2[i] = 1;
    Seq L;
    int m ;
    Init(L);
    Enter(L, i);
    while (Judge(L)) {
        Out(L, m);
        for (int j = 0;j < G.vexnum;j++) {
            if (G.arcs[m][j] == 1 && !visited2[j]) {
                cout << G.vexs[j];
                visited2[j] = 1;
                Enter(L, j);
            }

        }
    }
}
int main() {
    AMGraph G;
    CreateUNG(G);
    for (int j = 0; j < G.vexnum; j++) {  //输出邻接矩阵 
        for (int i = 0; i < G.vexnum; i++)
            cout << G.arcs[j][i] << "  ";
        cout << endl;
    }
    cout << endl << "输出(广度优先遍历):";
    BFT_AM(G, 0);第二个参数决定深度优先遍历从哪里开始
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值