问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

试以邻接矩阵为存储结构,写出连通图的深度优先搜索算法。

发布网友 发布时间:2022-04-25 21:00

我来回答

1个回答

热心网友 时间:2022-06-17 08:55

/* MGraph.cc: 图的邻接矩阵存储表示和实现 */
/* 包含图类型Graph定义;创建图;深度优先遍历;广度优先遍历 */
/* 用到引用型参数,在TC下无法通过编译,VC等C++编译器可通过 */

#include <stdio.h>
#include <string.h>
#include <limits.h> //含INT_MAX

#define VType char //顶点值类型
#define EType int //边权值类型
#define MAXVNUM 50 //最大顶点个数
#define DIGRAPH 0 //有向图(网)
#define UNDIGRAPH 1 //无向图(网)
#define INVALID INT_MAX //无效权值(最大整数表示无穷大)
#define EMPTY -1 //"空"顶点序号

//定义邻接矩阵表示的图类型Graph:
typedef struct
{
VType v[MAXVNUM]; //顶点序列(顶点编号从0开始)
EType w[MAXVNUM][MAXVNUM]; //邻接矩阵
int vn, en; //顶点数,边数
int kind; //图的种类:=DIGRAPH表示有向图(网),=UNDIGRAPH表示无向图(网)
}Graph;

int visited[MAXVNUM]; //访问标志数组(=1已访问,=0未访问)。遍历时用到的全局量。

/* 创建图G
参数Vex是存放顶点序列的数组
参数VVW是整数数组,以{Vi,Vj,Wij,...,-1}的形式依次存放各边的起止点序号(Vi,Vj)和权(Wij),-1是数据结束标志
参数kind=DIGRAPH表示有向图(网),=UNDIGRAPH表示无向图(网)
*/
void CreateGraph(Graph &G, VType *Vex, int VVW[], int kind)
{
int i, j, p, n, w;
n = strlen(Vex);
G.vn = n; //顶点数
G.kind = kind; //图的种类
//置顶点序列:
for (i = 0; i < n; i++)
G.v[i] = Vex[i];
//初始化邻接矩阵:
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
G.w[i][j] = INVALID;
//构造邻接矩阵:
p = 0; //VVW数组元素“指针”
n = 0; //边计数器
while (VVW[p] != -1)
{//只要p未到结束位置便继续:
i = VVW[p]; //边的起点序号
j = VVW[p + 1]; //边的终点序号
w = VVW[p + 2]; //边的权
G.w[i][j] = w; //置邻接矩阵的(i,j)位置元素
if (G.kind == UNDIGRAPH) //若是无向图(网),
G.w[j][i] = G.w[i][j]; //则置(i,j)的对称位置(j,i)
n++; //边计数器加1
p += 3; //p指向下一组(Vi,Vj,Wij)
}//end while
G.en = n; //边数
}//CreateGraph

/* 返回G中顶点i的一个未曾访问过的邻接点(序号) */
int NextAdjVex(Graph &G, int i)
{
int j, a;

a = EMPTY; //邻接点序号初始为"空"
//在邻接矩阵的第v行找有效元素:
for (j = 0; j < G.vn; j++)
{
if (G.w[i][j] == INVALID) //若当前元素是无效元素,
continue; //则继续找。
if (!visited[j])
{//若当前有效元素未曾访问过,则作为邻接点a:
a = j;
break;
}//end if
}//end for
return a;
}//NextAdjVex

/* 访问顶点i */
void visit(Graph &G, int i)
{
printf("%c", G.v[i]);
}//visit

/* 从第i个顶点出发深度优先遍历连通图G */
/* 调用DFS前可能需初始化数组visited[] */
void DFS(Graph &G, int i)
{int a;

visit(G, i); //访问i顶点
visited[i] = 1; //标注i顶点已访问
a = NextAdjVex(G, i); //找出一个i的邻接点a
while (a != EMPTY)
{//只要a存在便继续:
if (visited[a] == 0) //若a未曾访问,
DFS(G, a); //则从a出发继续进行深度优先遍历。
a = NextAdjVex(G, i); //找出i的下一个邻接点a
}//end while
}//DFS

/* 从第i个顶点出发深度优先遍历图G */
void DFSTrav(Graph &G, int i)
{int k;
//初始化各顶点的访问标志为0(未曾访问):
for (k = 0; k < G.vn; k++)
visited[k] = 0;
DFS(G, i); //从i出发遍历
//若G非连通图,执行一次DFS无法遍历所有顶点,还需用如下for对尚未访问的顶点DFS。
//若G是连通图,执行一次DFS就已遍历所有顶点,此时如下for什么也不做,因所有visited=1。
for (k = 0; k < G.vn; k++)
if (!visited[k]) DFS(G, k); //对尚未访问的顶点DFS
}//DFSTrav

//显示图的邻接矩阵
void ShowM(Graph &G)
{
int row, col, n;
n = G.vn; //顶点数
//以表格形式输出数组:
//输出表头:
printf(" ");
for(col = 0; col < n; col++)
printf("%3d",col);
printf("\n");
printf("---+");
for(col = 0; col < n; col++)
printf("---");
printf("\n");
//输出表体(矩阵元素):
for(row = 0; row < n; row++)
{
printf("%3d|", row);
for(col = 0; col < n; col++)
{
if (G.w[row][col] == INVALID)
printf("%3c", '*');
else
printf("%3d", G.w[row][col]);
}//end for col
printf("\n");
}//end for row
printf("\n");
}//ShowM
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
南师足贴的功效和用法是什么 五指运湿膏能减肥吗 清颜六白膏真的管用吗 一个手机号建了两个微信号第一个微信号密码忘了怎么找回 ug最好用的版本是什么 带“沙鸥”的诗句大全(87句) 归计狎沙鸥的意思是什么 指期乘禁马,无暇狎沙鸥。 “无机终日狎沙鸥”的出处是哪里 “无暇狎沙鸥”的出处是哪里 怎样用邻接矩阵为存储结构创建一个无向图 已知带权有向图如图所示,画出该图的邻接矩阵存储结构. 数据结构利用邻接矩阵存储结构怎样求图中两个顶点之间的所有路径? 在线急求熟悉图的两种常用的存储结构,邻接矩阵和邻接表。 有向图的邻接矩阵存储 图的存储结构可以采用邻接矩阵和邻接表,对于个有n 个顶点,e条边的有向图, (1)计算存储结构分别 有向图的邻接表存储如图所示,请画出其邻接矩阵存储结构 数据结构:画出下图的邻接矩阵存储结构 最受政府机关办公欢迎的OA办公系统是什么? oa办公自动化软件适合政府机关用吗? oa办公自动化软件适合政府机关用吗? oa在政府办公自动化及电子政务的应用主要有哪些方面? oa在政府办公自动化及电子政务的应用主要有哪些方面? 怎么删除拷贝的word里的文字之间的空格 word空白页面上的漂浮的字怎么删除?复制页面会复制下来,但就是删不掉 删除word中复制过来的最底下的文字 word中如何删除带阴影文字?1000多页,一部分涂上了灰色背景。现在想单独删除带背景的部分。请指教! 2007 word中复制的内容怎么删除底纹? 水利老师带徒弟,徒弟年终总结怎么写 在word复制一个图片,如何对图片中的内容进行删除 对于无向图的邻接矩阵存储结构,判断是否有回路 用队列实现以邻接矩阵作存储结构图的宽度优先搜索 要求采用邻接矩阵作为无向图的存储结构,邻接表作为有向图的存储结构,完成无向图和有向图的建立,并对建 存储结构为邻接矩阵,怎么编写无向图添加、删除一个顶点,添加、删除一条边的算法? 一个含有n个顶点的连通且无环无向图在其邻接矩阵存储结构共有多少个零元素 采用邻接矩阵存储结构对有向图进行拓扑排序的算法 数据结构,求无向图用邻接矩阵和邻接表的存储空间大小,怎么算? 编程实现以邻接表或邻接矩阵为存储结构,图的广度和深度优先搜索 哪里可以下载篮球裁判的教程? 哪里有篮球教学视频? qq表白套路对话有哪些呢? 在qq上怎么表白套路,qq表白套路台词 qq表白聊天套路对话从何演变而来? QQ表白套路对话有哪些 被qq表白套路对话过是什么样的感受? 喜欢一个女孩子,她也喜欢我,如何在QQ上委婉的表白 我想要个一个女的在QQ上表白,求一个套路! 求表白套路,最好是QQ上的,元旦节打算表白了 在QQ微信上表白有哪些套路 qq一问一答的套路表白