图实验(邻接矩阵)
用邻接矩阵实现图的存储,并完成图的深度优先遍历和广度优先遍历
头文件
#pragma once
const int MS = 10;//图中最多顶点数
class MGraph
{
public:
MGraph(char a[], int n, int e);
~MGraph() {};
void DFT(int v);//深度优先遍历
void BFT(int v);//广度优先遍历
int visited[MS];//判断顶点是否被访问过
private:
char vertex[MS];//存放顶点得数组
int edge[MS][MS];//存放边的数组
int vexNum, edgeNum;//顶点和边的数量
};
源文件
#include "MGraph.h"
#include<iostream>
MGraph::MGraph(char a[], int n, int e) {
vexNum = n; edgeNum = e;
//存储顶点
for (int i = 0; i < vexNum; i++) {
vertex[i] = a[i];
visited[i] = 0;
}
//初始化邻接矩阵
for (int i = 0; i < vexNum; i++) {
for (int j = 0; j < vexNum; j++) {
edge[i][j] = 0;
}
}
//依次输入每一条边,建立无向图
for (int i = 0; i < edgeNum; i++) {
int j, k;
std::cout << "请输入各边的信息";
std::cin >> j >> k;
edge[j][k] = 1;
edge[k][j] = 1;
}
}
void MGraph::DFT(int v) {
std::cout << vertex[v];
visited[v] = 1;
for (int j = 0; j < vexNum; j++) {
if (edge[v][j] == 1 && visited[j] == 0) {
DFT(j);
}
}
}
void MGraph::BFT(int v) {
int Q[MS];
int front = -1, rear = -1;
std::cout << vertex[v];
visited[v] = 1;
rear++;
Q[rear] = v;//被访问的顶点入队
while (front != rear) {//当队列非空
++front;
v = Q[front];//被访问过的出队
for (int j = 0; j < vexNum; j++) {
if (edge[j][v] == 1 && visited[j] == 0) {
std::cout << vertex[j];
visited[j] = 1;
rear++;
Q[rear] = j;
}
}
}
}
测试程序
#include<iostream>
using namespace std;
#include"MGraph.h"
int main() {
char ch[] = { 'A','B','C','D','E' };
MGraph MG(ch, 5, 6);
cout << "\n深度优先遍历序列是:";
MG.DFT(0);//从0出发
for (int i = 0; i < MS; i++) {
MG.visited[i] = 0;
}
cout << "\n广度优先遍历序列是:";
MG.BFT(0);//从0出发
}