注:本文创建无向图采用尾插!!(头插跟测试样例结果不匹配)
Description |
根据输入建立无向图,利用邻接表法对该图进行广度优先搜索,并输出遍历序列。 说明: 输入第一行为结点数;第二行为结点的值;第三行值最后为该图的弧(边);默认广度优先遍历从第一个结点出发。 输出为广度优先遍历序列。 |
Sample Input |
5 A B C D E A B B C B E C D D E |
Sample Output |
A B C E D |
Hint |
输出有换行符 |
#include <bits/stdc++.h>
#define Maxnum 1005
#define Maxint 32767
using namespace std;
// 邻接表
typedef struct Arcnode
{
int adjvex;
struct Arcnode *nextarc;
int info;
};
typedef struct Vnode
{
char data;
Arcnode *firstarc;
} Vnode, Adjlist[Maxnum];
typedef struct
{
int edgenum;
Adjlist verices;
int vex, arc;
} ALG;
int locatevex(ALG G, char v)
{ // 查找
int i;
for (int i = 0; i < G.vex; i++)
{
if (v == G.verices[i].data)
{
return i;
}
}
}
void creatALG(ALG &G)
{ // 创建无向图(邻接表采用尾插--根据题目判断)
cin >> G.vex;
char v1, v2;
for (int i = 0; i < G.vex; i++)
{
cin >> G.verices[i].data;
G.verices[i].firstarc = NULL;
}
Arcnode *p1 = new Arcnode;
Arcnode *q1 = new Arcnode;
p1 = NULL;
q1 = NULL;
while (cin >> v1 >> v2)
{
int i = locatevex(G, v1);
int j = locatevex(G, v2);
Arcnode *p = new Arcnode;
Arcnode *q = new Arcnode;
p->adjvex = j;
if (G.verices[i].firstarc == NULL)
{ // 为空表示第一次插在firstarc上下手
p->nextarc = NULL;
G.verices[i].firstarc = p;
p1 = p;
}
else
{ // 后序则在p上下手
p1->nextarc = p;
p->nextarc = NULL;
p1 = p;
}
q1 = G.verices[j].firstarc;
q->adjvex = i;
if (G.verices[j].firstarc == NULL)
{ // 为空表示第一次插在firstarc上下手
q->nextarc = NULL;
G.verices[j].firstarc = q;
q1 = q;
}
else
{ // 后序则在q上下手
q1->nextarc = q;
q->nextarc = NULL;
q1 = q;
}
}
}
queue<int> Q;
void BFS(ALG G)
{ // 广度优先搜索
int visit[Maxnum];
int m = 0, w;
Arcnode *p = new Arcnode;
for (int i = 0; i < G.vex; i++)
{ // 辅助数组初始化
visit[i] = 0;
}
for (int i = 0; i < G.vex; i++)
{
int v = i;
if (!visit[v])
{ // 没被访问
Q.push(v); // 下标进队
while (!Q.empty())
{ // 队不空
m++; // 控制输出空格
w = Q.front(); // 对头
Q.pop();
visit[w] = 1; // 标记
cout << G.verices[w].data;
if (m != G.vex)
{
cout << " ";
}
p = G.verices[w].firstarc;
while (p != NULL)
{ // 循环对其邻接结点进行判断
if (!visit[p->adjvex])
{ // 未访问就进队并标记
Q.push(p->adjvex);
// cout<<"*"<<Q.front();
visit[p->adjvex] = 1;
}
p = p->nextarc;
}
}
}
}
cout << "\n";
}
int main()
{
ALG G;
creatALG(G);
BFS(G);
return 0;
}