2021.11.5数据结构实验课作业——图的遍历
1、 图的存储(必做题,对书上代码稍作修改)
(1)采用邻接表或邻接矩阵的形式构建图
(2)输入:图的类型、顶点个数及顶点数据、每条边,如
1 //0—有向图,1—无向图
4
A B C D //4个顶点,分别是A、B、C、D
3
A B
A C
B D //3条边,分别是(A,B)、(A,C)、(B,D)
(3)有向图和无向图均要测试,邻接表和邻接矩阵至少选择一种
2、 图的遍历(必做题,对书上代码书稍作修改)
(1) 在邻接表或邻接矩阵的存储结构上实现深度优先遍历算法和广度优先遍历算法
(2) 按字典序对各个顶点排序,从最小顶点开始遍历,输出遍历序列
(3) 深度优先遍历和广度优先遍历均要实现
两个题当一个题写
基本思想
算法BFS
队列Q初始化;
访问顶点v;修改标志visited[v]=1;顶点v入队列Q;
While(队列Q非空)
v=队列Q的队头元素出队;
w=顶点v的第一个邻接点;
while(w存在)
如果w未被访问,则
访问顶点w;修改标志visited[w]=1;顶点w入队列Q;
w=顶点v下一个邻接点;
算法DFS
访问顶点v;修改标志visited[v]=1;
w=顶点v的第一个邻接点;
while(w存在)
if(w未被访问)从顶点w出发递归执行该算法;
w=顶点v的下一个邻接点;
点击查看代码main.cpp
#include <iostream>
#include <cstdio>
using namespace std;
const int MaxSize = 11;
class MGraph
{
public:
MGraph(T a[], int n, int e, int f); //构造函数,建立具有n个顶点e条边的图
void DFTraverse(int v); //深度优先遍历图
void BFTraverse(int v); //广度优先遍历图
private:
T vertex[MaxSize]; //存放图中顶点的数组
int edge[MaxSize][MaxSize]; //存放图中边的数组
int vertexNum, edgeNum; //图的顶点数和边数
};
bool visited[MaxSize];
template<typename T>
MGraph<T>::MGraph(T a[], int n, int e, int f) {
vertexNum = n; edgeNum = e;
for (int i = 0; i < vertexNum; i++)
vertex[i] = a[i];
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
edge[i][j] = 0;
if (f == 1)
for (int u, v, i = 0; i < edgeNum; ++i) {
cin >> u >> v;
edge[u][v] = edge[v][u] = 1;
}
else
for (int u, v, i = 0; i < edgeNum; ++i) {
cin >> u >> v;
edge[u][v] = 1;
}
return;
}
template<typename T>
void MGraph<T>::DFTraverse(int v)
{
cout << vertex[v] << ' ';
visited[v] = true;
for (int j = 0; j < vertexNum; ++j)
if (edge[v][j] == 1 && !visited[j])
DFTraverse(j);
}
template<typename T>
void MGraph<T>::BFTraverse(int v)
{
int w, j, Q[MaxSize]; //采用顺序队列
int front = -1, rear = -1; //初始化队列
cout << vertex[v] << ' ';
visited[v] = true;
Q[++rear] = v; //被访问顶点入队
while (front != rear) //当队列非空时
{
w = Q[++front]; //将队头元素出队并送到v中
for (j = 0; j < vertexNum; ++j)
if (edge[w][j] == 1 && visited[j] == 0) {
cout << vertex[j];
visited[j] = true;
Q[++rear] = j;
}
}
cout << endl;
}
int main()
{
int choice, n, e;
char ch[MaxSize];
cout << "请输入要选择的图的类型:" << endl << "1.无向图" << endl << "2.有向图" << endl;
cin >> choice;
cout << "请输入顶点的个数:" << endl;
cin >> n;
cout << "请依次输入顶点:" << endl;
for (int i = 0; i < n; ++i)
cin >> ch[i];
cout << "请输入边的的个数:" << endl;
cin >> e;
for (int i = 0; i < n; ++i)
visited[i] = false;
cout << "深度优先遍历序列是:" << endl;
MG.DFTraverse(0);
cout << endl;
for (int i = 0; i < n; ++i)
visited[i] = false;
cout << "广度优先遍历序列是:" << endl;
MG.BFTraverse(0);
return 0;
}
/*
1
5
A B C D E
6
0 1
0 2
0 3
1 2
1 3
2 4
*/