图的深度优先遍历与广度优先遍历

Posted levarz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的深度优先遍历与广度优先遍历相关的知识,希望对你有一定的参考价值。

描述

给出一个无向图顶点和边的信息,输出这个无向图的深度优先遍历序列和广度优先遍历序列。从一个顶点出发如果有2个以上的顶点可以访问时,我们约定先访问编号大的那个顶点。示例输入对应的图如下图所示:

background Layer 1 v1 v2 v3 v4 v6 v8 v7 v5 ####输入 输入的第1行有2个整数m和n。表示图g有m个顶点和n条边。 第2行是m个以空格隔开的字符串,依次是图中第1个顶点的名字,第2个顶点的名字.....第m个顶点的名字。 此后还有n行,每行由2个字符串构成,分别是构成图中1条边的两个顶点。我们约定不会有重边。 ####输出 输出有2行。 第1行是从第1个顶点出发对图g做深度优先遍历得到的顶点序列。 第2行是从第1个顶点出发对图g做广度优先遍历得到的顶点序列。 ####样例输入
8 9
v1 v2 v3 v4 v5 v6 v7 v8
v1 v2
v1 v3
v1 v6
v2 v3
v2 v4
v3 v4
v4 v6
v5 v6
v7 v8
####样例输出
v1 v6 v5 v4 v3 v2 v7 v8
v1 v6 v3 v2 v5 v4 v7 v8
####提示 注意:从一个顶点出发如果有2个以上的顶点可以访问时,我们约定先访问编号大的那个顶点。 ps:注意提示内容,输出方式!!!!,然后正常做就ok ####完整代码 ```c #include #include #include #include #define VISITED 1 #define UNVISITED 0 #define MAX_SIZE 31767 #define MAX_LEN 30

using namespace std;

int visited[MAX_SIZE] = {0};
typedef struct ANode
{
int adjvex;
struct ANode *nextarc;
}AreNode;
typedef struct Vnode
{
char info[MAX_LEN];
AreNode *firstarc;
}VNode;
typedef struct
{
VNode adjlist[MAX_SIZE];
int n, e;
}AdjGraph;
void init_visited_mess(AdjGraph g)
{
memset(visited,g->n,UNVISITED);
}
void CreatGraph(AdjGraph &g, int n, int e)
{
char vex[MAX_LEN], nextarc[MAX_LEN];
int i, j;
g = (AdjGraph
) malloc (sizeof(AdjGraph));
g->n = n;
g->e = e;
for (i = 1; i <= n; i++) {
scanf("%s ",g->adjlist[i].info);
g->adjlist[i].firstarc = NULL;
}
while (e--) {
AreNode nex;
scanf("%s %s",vex,nextarc);
for (i = 1; i <= n; i++)
if (strcmp(g->adjlist[i].info,vex)0) break;
for (j = 1; j <= n; j++)
if (strcmp(g->adjlist[j].info,nextarc)
0) break;
nex = (AreNode
) malloc (sizeof(AreNode));
nex->adjvex = j;
nex->nextarc = g->adjlist[i].firstarc;
g->adjlist[i].firstarc = nex;
nex = (AreNode
) malloc (sizeof(AreNode));
nex->adjvex = i;
nex->nextarc = g->adjlist[j].firstarc;
g->adjlist[j].firstarc = nex;
}
}
void DisplayGraph(AdjGraph *g)
{
int i;
AreNode p;
for (i = 1; i <= g->n; i++) {
p = g->adjlist[i].firstarc;
printf("%3s: ",g->adjlist[i].info);
while (NULL != p) {
printf("%3s ",g->adjlist[p->adjvex].info);
p = p->nextarc;
}
printf(" ");
}
}
AreNode
find_nextarc_max_adjvex(AdjGraph *g, int adjvex)
{
AreNode *p;
p = g->adjlist[adjvex].firstarc;
int max_adjvex = 0;
while (NULL != p) {
if (visited[p->adjvex] == UNVISITED)
max_adjvex = max_adjvex > p->adjvex ? max_adjvex : p->adjvex;
p = p->nextarc;
}
p = g->adjlist[adjvex].firstarc;
while (NULL != p) {
if (p->adjvex == max_adjvex) break;
p = p->nextarc;
}
if (max_adjvex == adjvex) p = NULL;
return p;
}
// int find_nextarc_max_adjvex(AdjGraph *g, int adjvex)
// {
// AreNode *p;
// p = g->adjlist[adjvex].firstarc;
// int max_adjvex = 0;
// while (NULL != p) {
// if (visited[p->adjvex] == UNVISITED)
// max_adjvex = max_adjvex > p->adjvex ? max_adjvex : p->adjvex;
// p = p->nextarc;
// }
// return max_adjvex;
// }
void DFS_connected_graph(AdjGraph *g, int adjvex)
{
int nex_adj;
AreNode *p;
printf("%s ",g->adjlist[adjvex].info);
visited[adjvex] = VISITED;
p = find_nextarc_max_adjvex(g,adjvex);
while (NULL != p) {
if (visited[p->adjvex] == UNVISITED) DFS_connected_graph(g,p->adjvex);
p = p->nextarc;
}
}
void DFS(AdjGraph *g)
{
int i;
for (i = 1; i <= g->n; i++)
if (visited[i] == UNVISITED) DFS_connected_graph(g,i);
memset(visited,UNVISITED,MAX_SIZE);
}
void BFS_connected_graph(AdjGraph *g, int adjvex)
{
int top_adjvex, i;
AreNode *p;
queue nextarcs;
printf("%s ",g->adjlist[adjvex].info);
visited[adjvex] = VISITED;
nextarcs.push(adjvex);
while (!nextarcs.empty()) {
top_adjvex = nextarcs.front();
nextarcs.pop();
p = find_nextarc_max_adjvex(g,top_adjvex);
while (NULL != p) {
if (visited[p->adjvex] == UNVISITED) {
printf("%s ",g->adjlist[p->adjvex].info);
visited[p->adjvex] = VISITED;
nextarcs.push(p->adjvex);
}
p = find_nextarc_max_adjvex(g,top_adjvex);
}
}
}
void BFS(AdjGraph *g)
{
int i;
for (i = 1; i <= g->n; i++)
if (visited[i] == UNVISITED) BFS_connected_graph(g,i);
memset(visited,UNVISITED,MAX_SIZE);
}
int main(int argc, char const *argv[])
{
AdjGraph *g;
int n,m;
cin >> n >> m;
CreatGraph(g,n,m);
// DisplayGraph(g);
DFS(g); cout << endl;
BFS(g);
system("pause");
return 0;
}

以上是关于图的深度优先遍历与广度优先遍历的主要内容,如果未能解决你的问题,请参考以下文章

深度优先遍历与广度优先遍历的区别

图的遍历:深度优先遍历,广度优先遍历

c语言图的遍历,邻接表存储,深度,广度优先遍历

图的深度优先遍历与广度优先遍历

图的深度与广度优先遍历

PHP数据结构-图的遍历:深度优先与广度优先