#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);第二个参数决定深度优先遍历从哪里开始
}
图的广度优先遍历
最新推荐文章于 2023-10-24 15:27:31 发布