基于邻接矩阵表示的广度优先遍历。 #include <stdio.h> #include <stdlib.h> #define MVNum 100 int visited[MVNum]; typedef struct{ char vexs[MVNum]; int arcs[MVNum][MVNum]; int vexnum,arcnum; }Graph; void CreateUDN(Graph &G);//实现细节隐藏 void BFS(Graph G, int v){ char Q[MVNum]; int f=0,r=0; int u,w; printf("%c ",G.vexs[v]); visited[v] = 1; Q[r++]=v; while( ){ u= ; for(w = 0; w < G.vexnum; w++){ if( ) { printf("%c ",G.vexs[w]); visited[w] = 1; =w; } } } } void BFSTraverse(Graph G){ int v; for(v = 0; v < G.vexnum; ++v) visited[v] = 0; for(v = 0; v < G.vexnum; ++v) if(!visited[v]) BFS(G, v); } int main(){ Graph G; CreateUDN(G); BFSTraverse(G); return 0; }
时间: 2024-01-05 20:02:06 浏览: 82
这是一个基于邻接矩阵表示的广度优先遍历的代码实现。其中,Graph结构体包含了图的顶点集和边集,visited数组表示顶点是否被访问过。CreateUDN函数用于创建无向图,BFS函数用于进行广度优先遍历,BFSTraverse函数用于遍历整个图。
具体实现细节如下:
1. 在BFS函数中,首先访问起始顶点v,并将其标记为已访问,加入队列Q中。
2. 进入while循环,当队列不为空时,取出队头元素u,并遍历u的所有邻接点w。
3. 对于每个邻接点w,如果该点未被访问过,则访问该点,并将其标记为已访问,加入队列Q中。
4. 循环结束后,所有与起始顶点v相连通的顶点都被访问过。
5. 在BFSTraverse函数中,对于每个未被访问过的顶点,调用BFS函数进行广度优先遍历。
需要注意的是,此代码仅适用于无向图。如果是有向图,需修改邻接矩阵的赋值方式。同时,还需注意图的连通性,如果图不连通,需要对每个连通分量都进行广度优先遍历。
相关问题
函数接口定义: void CreateUDG(AMGraph &G); //创建图,采用邻接矩阵存储 int DFS(AMGraph G, int v);//以v为起点深度优先遍历,求出各顶点值的和作为函数返回值 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> #define MVNum 100 int visited[MVNum]; typedef struct{ int vexs[MVNum]; //顶点向量,各小岛对应积分
好的,根据您提供的函数接口定义,我给出以下代码示例供参考:
```c++
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
#define MVNum 100
// 邻接矩阵存储的图结构体
typedef struct {
int vexs[MVNum]; // 顶点向量,各小岛对应积分
int arcs[MVNum][MVNum]; // 邻接矩阵,记录各小岛之间的连通情况
int vexnum, arcnum; // 顶点数和边数
} AMGraph;
// 创建图,采用邻接矩阵存储
void CreateUDG(AMGraph& G) {
cout << "请输入小岛数和边数:";
cin >> G.vexnum >> G.arcnum;
cout << "请输入各小岛对应积分:";
for (int i = 0; i < G.vexnum; i++) {
cin >> G.vexs[i];
}
// 初始化邻接矩阵
for (int i = 0; i < G.vexnum; i++) {
for (int j = 0; j < G.vexnum; j++) {
G.arcs[i][j] = 0;
}
}
// 建立边
cout << "请输入各边的起点和终点:";
int v1, v2;
for (int i = 0; i < G.arcnum; i++) {
cin >> v1 >> v2;
G.arcs[v1][v2] = 1;
G.arcs[v2][v1] = 1;
}
}
// 以v为起点深度优先遍历,求出各顶点值的和作为函数返回值
int DFS(AMGraph G, int v) {
stack<int> s;
vector<int> path;
int sum = 0;
// 初始化visited数组
for (int i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
// 从起点开始遍历
s.push(v);
visited[v] = 1;
sum += G.vexs[v];
path.push_back(v);
while (!s.empty()) {
int cur = s.top();
int flag = 0;
for (int i = 0; i < G.vexnum; i++) {
if (G.arcs[cur][i] == 1 && visited[i] == 0) {
visited[i] = 1;
s.push(i);
sum += G.vexs[i];
path.push_back(i);
flag = 1;
break;
}
}
if (flag == 0) {
s.pop();
}
}
// 输出遍历路径
cout << "遍历路径为:";
for (int i = 0; i < path.size(); i++) {
cout << path[i] << " ";
}
cout << endl;
return sum;
}
int main() {
AMGraph G;
CreateUDG(G);
int sum = DFS(G, 0);
cout << "闯关成功者共获得 " << sum << " 积分" << endl;
return 0;
}
```
上述代码中,我们先定义了一个邻接矩阵存储的图结构体`AMGraph`,然后定义了`CreateUDG`和`DFS`两个函数,分别用于创建图和进行深度优先遍历计算积分。
在`DFS`函数中,我们使用了一个栈`s`来记录遍历路径,使用一个`path`列表来记录最终的遍历路径,使用一个`sum`变量来记录积分总和。我们首先将起点入栈,并将其对应的积分加入总和中,然后开始遍历。
在遍历过程中,首先取出栈顶元素,然后遍历该元素相邻的未访问过的岛屿,将其压入栈中,并将其对应的积分加入总和中。如果当前岛屿没有未访问过的相邻岛屿,说明该岛屿已经被完全遍历过了,我们将其从栈中弹出。
最后,我们将最终遍历路径输出,并返回积分总和。在`main`函数中,我们调用`CreateUDG`函数创建图,调用`DFS`函数进行深度优先遍历,并输出结果。
2、实现图的深度优先遍历和广度优先遍历 /*用邻接矩阵法创建有向网的算法如下:*/ //#include "adjmatrix.h" #include<stdio.h> *最多顶点个数*/ #define MAX VERTEX NUM20 *表示极大值,即∞*/ #define INFINITY 32768 #defne True 1 #define False 0 #define Error -1 16896 #define Ok 1
深度优先遍历(DFS):
```c++
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
typedef char VertexType;
typedef int EdgeType;
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];
EdgeType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum, arcnum;
} MGraph;
bool visited[MAX_VERTEX_NUM];
void CreateGraph(MGraph* G) {
printf("请输入顶点数和边数:");
scanf("%d %d", &(G->vexnum), &(G->arcnum));
printf("请输入顶点:");
for (int i = 0; i < G->vexnum; i++) {
scanf(" %c", &(G->vexs[i]));
}
for (int i = 0; i < G->vexnum; i++) {
for (int j = 0; j < G->vexnum; j++) {
if (i == j) {
G->arcs[i][j] = 0;
} else {
G->arcs[i][j] = INFINITY;
}
}
}
printf("请输入每条边的起点、终点、权值:\n");
for (int k = 0; k < G->arcnum; k++) {
int i, j, w;
scanf("%d %d %d", &i, &j, &w);
G->arcs[i][j] = w;
}
}
void DFS(MGraph* G, int v) {
visited[v] = true;
printf("%c ", G->vexs[v]);
for (int j = 0; j < G->vexnum; j++) {
if (G->arcs[v][j] != INFINITY && !visited[j]) {
DFS(G, j);
}
}
}
void DFSTraverse(MGraph* G) {
for (int i = 0; i < G->vexnum; i++) {
visited[i] = false;
}
for (int i = 0; i < G->vexnum; i++) {
if (!visited[i]) {
DFS(G, i);
}
}
}
int main() {
MGraph G;
CreateGraph(&G);
printf("深度优先遍历结果:");
DFSTraverse(&G);
return 0;
}
```
广度优先遍历(BFS):
```c++
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
typedef char VertexType;
typedef int EdgeType;
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];
EdgeType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum, arcnum;
} MGraph;
bool visited[MAX_VERTEX_NUM];
void CreateGraph(MGraph* G) {
printf("请输入顶点数和边数:");
scanf("%d %d", &(G->vexnum), &(G->arcnum));
printf("请输入顶点:");
for (int i = 0; i < G->vexnum; i++) {
scanf(" %c", &(G->vexs[i]));
}
for (int i = 0; i < G->vexnum; i++) {
for (int j = 0; j < G->vexnum; j++) {
if (i == j) {
G->arcs[i][j] = 0;
} else {
G->arcs[i][j] = INFINITY;
}
}
}
printf("请输入每条边的起点、终点、权值:\n");
for (int k = 0; k < G->arcnum; k++) {
int i, j, w;
scanf("%d %d %d", &i, &j, &w);
G->arcs[i][j] = w;
}
}
void BFS(MGraph* G, int v) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
printf("%c ", G->vexs[v]);
visited[v] = true;
queue[rear++] = v;
while (front != rear) {
int i = queue[front++];
for (int j = 0; j < G->vexnum; j++) {
if (G->arcs[i][j] != INFINITY && !visited[j]) {
printf("%c ", G->vexs[j]);
visited[j] = true;
queue[rear++] = j;
}
}
}
}
void BFSTraverse(MGraph* G) {
for (int i = 0; i < G->vexnum; i++) {
visited[i] = false;
}
for (int i = 0; i < G->vexnum; i++) {
if (!visited[i]) {
BFS(G, i);
}
}
}
int main() {
MGraph G;
CreateGraph(&G);
printf("广度优先遍历结果:");
BFSTraverse(&G);
return 0;
}
```
阅读全文