欢迎光临散文网 会员登陆 & 注册

DFS(深度优先遍历)算法实现与逻辑讲解 计算机考研 数据结构(408)

2023-06-24 09:46 作者:板凳刘520  | 我要投稿

#include <stdio.h>

#define self2 0

#define VexNum 100

typedef char VerType;

typedef int ArcType;


typedef struct 

{

VerType vex[VexNum];//图的顶点名,如v1,v2 ...

ArcType arc[VexNum][VexNum];//图的边

int vexnum, arcnum;//图的顶点数和边数

}MGraph;


//定义函数,输入顶点名,获得顶点下标

int VexName(MGraph G, char v);

//创建图

void CreateUD(MGraph& G)

{

//8个顶点、9条边

G.vexnum = 8;

G.arcnum = 9;

G.vex[0] = 'v1';

G.vex[1] = 'v2';

G.vex[2] = 'v3';

G.vex[3] = 'v4';

G.vex[4] = 'v5';

G.vex[5] = 'v6';

G.vex[6] = 'v7';

G.vex[7] = 'v8';

//初始化邻接矩阵,即顶点的边,初始值为0

for (int i =0; i< G.vexnum;i++)

{

for (int j =0 ;j <G.vexnum;j++)

{

G.arc[i][j] = self2;

}

}

//如果两个顶点有连接,把对应的边设置为1 

int i, j;

i = VexName(G,'v1');

j = VexName(G, 'v2');

//两个顶点有边的话,双向都设置为1

G.arc[i][j] = G.arc[j][i] = 1;


i = VexName(G, 'v1');

j = VexName(G, 'v3');

G.arc[i][j] = G.arc[j][i] = 1;


i = VexName(G, 'v2');

j = VexName(G, 'v4');

G.arc[i][j] = G.arc[j][i] = 1;


i = VexName(G, 'v2');

j = VexName(G, 'v5');

G.arc[i][j] = G.arc[j][i] = 1;


i = VexName(G, 'v5');

j = VexName(G, 'v8');

G.arc[i][j] = G.arc[j][i] = 1;


i = VexName(G, 'v4');

j = VexName(G, 'v8');

G.arc[i][j] = G.arc[j][i] = 1;


i = VexName(G, 'v3');

j = VexName(G, 'v6');

G.arc[i][j] = G.arc[j][i] = 1;


i = VexName(G, 'v3');

j = VexName(G, 'v7');

G.arc[i][j] = G.arc[j][i] = 1;


i = VexName(G, 'v6');

j = VexName(G, 'v7');

G.arc[i][j] = G.arc[j][i] = 1;


}

// 输入顶点名,输出顶点对应的下标

int VexName(MGraph G, char v)

{

for (int i = 0; i < G.vexnum; i++)

{

if (G.vex[i] == v)

{

return i;

}

}

}


bool visited[VexNum];


//递归遍历图

void Prints(MGraph G, int v)

{

printf("v%c->", G.vex[v]);

visited[v] = true;

for (int w =0 ; w<G.vexnum;w++)

{

//该w点和v点之间有边,且该w点没有被访问过

//则访问该点

if (G.arc[v][w]!= 0 && !visited[w])

{

Prints(G, w);

}

}

}

int main()

{

MGraph G;

CreateUD(G);

int v = 0;

Prints(G, v);

return 0;

}


DFS(深度优先遍历)算法实现与逻辑讲解 计算机考研 数据结构(408)的评论 (共 条)

分享到微博请遵守国家法律