一、实现功能:
1、通过邻接矩阵完成图的创建。
2、完成深度优先和广度优先遍历。
二、示意图
(1)需要程序实现的无向图如下:
(2)邻接矩阵和顶点表的图示:
三、程序代码:
1、输入样例:(有关系的结点下标)
0 1
0 2
1 3
1 4
4 2
2 0
2、输出样例:
3、程序代码:
#include<iostream> #define MAXSIZE 100 using namespace std; int visited[MAXSIZE] = { 0 };//全局变量数组初始化,用来标记访问完的顶点 class MGraph { public: MGraph(char a[], int n, int e);//有参构造函数 ~MGraph(); public: void DFtraverse(int v);//深度遍历 void BFtraverse(int v);//广度遍历 private: char vertex[MAXSIZE];//顶点表 int edge[MAXSIZE][MAXSIZE];//边表 int VertexNum, EdgeNum;//顶点数,边数 }; //构造函数 MGraph::MGraph(char a[], int n, int e) { int i, j, k;//i,j:顶点下标,k:边数 VertexNum = n; EdgeNum = e; for (i = 0; i < VertexNum; i++)//存入顶点信息 vertex[i] = a[i]; for (i = 0; i < VertexNum; i++)//初始化邻接矩阵 for (j = 0; j < VertexNum; j++) edge[i][j] = 0; for (k = 0; k < EdgeNum; k++)//输入顶点的边 { cin >> i >> j;//输入关系边(相连的顶点下标) edge[i][j] = 1;//有关系的置为1 edge[j][i] = 1;//因为此图是无向图,所以邻接矩阵是对称矩阵 } } //析构函数 MGraph::~MGraph() { //静态存储分配 //自动释放存储空间 //析构函数为空 } //深度优先遍历(栈结构-递归) void MGraph::DFtraverse(int v) { cout << vertex[v]<<'\t'; visited[v] = 1; for (int j = 0; j < VertexNum; j++) { if (edge[v][j] == 1 && visited[j] == 0)//遍历邻接矩阵,如果发现两顶点有关系并且这个顶点未被访问 DFtraverse(j);//就递归,访问这个顶点(在下次递归的函数中输出这个顶点值,并标记以访问) } } //广度优先遍历(队列结构) void MGraph::BFtraverse(int v) { for (int i = 0; i < 5; i++)//初始顶点都未被访问,标记为0-------------------------在主函数中程序执行遵循自上而下的顺序规则,所以在实现深度遍历后visited[i]已经全被标记,所以想要接着执行广度遍历,再次函数中要访问数组重新初始化 visited[i] = 0; //也可以通过在主函数中添加判断或者开关语句实现遍历功能 int w, j, Q[MAXSIZE];//创建顺序队列(w出队暂存 j 迭代器) int front = -1; int rear = -1;//队列初始化 cout << vertex[v]<<"\t"; visited[v] = 1;//访问并标记此节点已经访问完了 Q[++rear] = v;//被访问的顶点入队 while (front != rear)//队列存在 { w = Q[++front];//出队 for (j = 0; j < VertexNum; j++) if (edge[w][j] == 1 && visited[j] == 0)//遍历队列,如果边存在关系,并且未被访问 { cout << vertex[j]<<"\t";//访问该顶点 visited[j] = 1;//标记已访问 Q[++rear] = j;//入队 } } } int main() { int i; char ch[] = { 'A','B','C','D','E' }; MGraph MG{ ch,5,6 };//在构造函数中传入初始默认参数{5个顶点6个边} for (i = 0; i < 5; i++)//初始顶点都未被访问,标记为0 visited[i] = 0; cout << endl<<"深度优先遍历是:" << endl; MG.DFtraverse(0);//从顶点0出发 cout << endl<<"广度优先遍历是:" << endl; MG.BFtraverse(0); return 0; }