1.邻接矩阵的建立
#include<iostream>
using namespace std;
#include<queue>
#include<stdbool.h>
//邻接矩阵的创建
typedef char vextype;//顶点类型自定义
typedef int edgetype;//边上的权值自定义
#define MAXVEX 100//最大顶点数
#define MAXS 66666//代表无穷
typedef struct
{
vextype vexs[MAXVEX];//顶点表
edgetype arc[MAXVEX][MAXVEX];//邻接矩阵
int numNodes;//当前的顶点数
int numEdges;//当前的边数
}MGraph;
1.引用建立无向网图的邻接矩阵表示
//1.引用建立无向网图的邻接矩阵表示
void CreatGraph(MGraph& G)
{
cout << "请输入顶点数和边数:";
cin >> G.numNodes >> G.numEdges;
cout << "请输入所有顶点信息:" << endl;
for (int i = 0; i < G.numNodes; i++)
cin >> G.vexs[i];
for (int i = 0; i < G.numNodes; i++)
for (int j = 0; j < G.numNodes; j++)
G.arc[i][j] = 0;
cout << "请输入顶点组成的边及其权值:" << endl;
for (int i = 0; i < G.numEdges; i++)
{
int w, m, n;
cin >> m >> n >> w;
G.arc[m][n] = w;
G.arc[n][m] = G.arc[m][n];
}
}
2.指针建立无向网图的邻接矩阵表示
//2.指针建立无向网图的邻接矩阵表示
void CreatGraph(MGraph* G)
{
cout << "请输入顶点数和边数:";
cin >> G->numNodes >> G->numEdges;
cout << "请输入所有顶点信息:" << endl;
for (int i = 0; i < G->numNodes; i++)
cin>>G->vexs[i];
for (int i = 0; i < G->numNodes; i++)
for (int j = 0; j < G->numNodes; j++)
G->arc[i][j] = 0;
cout << "请输入顶点组成的边及其权值:" << endl;
for (int i = 0; i < G->numEdges; i++)
{
int w, m, n;
cin >> m >> n >> w;
G->arc[m][n] = w;
G->arc[n][m] = G->arc[m][n];
}
}
2.打印邻接矩阵
//打印邻接矩阵
void PrintGraph(MGraph G)
{
int len = G.numNodes;
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
{
cout << G.arc[i][j] << " ";
}
cout << endl;
}
}
3.邻接矩阵的深度优先递归算法
//3.邻接矩阵的深度优先递归算法
#define MAXVEX 100
int visit[MAXVEX] = { 0 };
void DFS(MGraph G, int i)
{
cout << G.vexs[i] << " ";
visit[i] = 1;
for (int j = 0; j < G.numNodes; j++)
{
if (!visit[j] && G.arc[i][j] != 0)
{
DFS(G, j);
}
}
}
void DFST(MGraph G)
{
for (int i = 0; i < G.numNodes; i++)
visit[i] = 0;
for (int i = 1; i < G.numNodes; i++)
{
if(!visit[i])
DFS(G, i);
}
}
4.邻接矩阵的广度优先遍历算法
//邻接矩阵的广度优先遍历算法
void BFS(MGraph G)
{
queue<vextype> Q;
for (int i = 0; i < G.numNodes; i++)
visit[i] = 0;
for (int i = 0; i < G.numNodes; i++){
if (!visit[i]){
visit[i] = 1;
cout << G.vexs[i] << " ";
Q.push(i);
while (!Q.empty()){
Q.pop();
for (int j = 0; j < G.numNodes; j++)
if (G.arc[i][j] != 0 && visit[j] == 0){
visit[j] = 1;
cout << G.vexs[j] << " ";
Q.push(j);
}
}
}
}
}
5.测试实例
#include<iostream>
using namespace std;
#include<queue>
#include<stdbool.h>
//邻接矩阵的创建
typedef char vextype;//顶点类型自定义
typedef int edgetype;//边上的权值自定义
#define MAXVEX 100//最大顶点数
#define MAXS 66666//代表无穷
typedef struct
{
vextype vexs[MAXVEX];//顶点表
edgetype arc[MAXVEX][MAXVEX];//邻接矩阵
int numNodes;//当前的顶点数
int numEdges;//当前的边数
}MGraph;
//1.引用建立无向网图的邻接矩阵表示
void CreatGraph(MGraph& G)
{
cout << "请输入顶点数和边数:";
cin >> G.numNodes >> G.numEdges;
cout << "请输入所有顶点信息:" << endl;
for (int i = 0; i < G.numNodes; i++)
cin >> G.vexs[i];
for (int i = 0; i < G.numNodes; i++)
for (int j = 0; j < G.numNodes; j++)
G.arc[i][j] = 0;
cout << "请输入顶点组成的边及其权值:" << endl;
for (int i = 0; i < G.numEdges; i++)
{
int w, m, n;
cin >> m >> n >> w;
G.arc[m][n] = w;
G.arc[n][m] = G.arc[m][n];
}
}
//2.指针建立无向网图的邻接矩阵表示
/*void CreatGraph(MGraph* G)
{
cout << "请输入顶点数和边数:";
cin >> G->numNodes >> G->numEdges;
cout << "请输入所有顶点信息:" << endl;
for (int i = 0; i < G->numNodes; i++)
cin>>G->vexs[i];
for (int i = 0; i < G->numNodes; i++)
for (int j = 0; j < G->numNodes; j++)
G->arc[i][j] = 0;
cout << "请输入顶点组成的边及其权值:" << endl;
for (int i = 0; i < G->numEdges; i++)
{
int w, m, n;
cin >> m >> n >> w;
G->arc[m][n] = w;
G->arc[n][m] = G->arc[m][n];
}
}*/
//3.邻接矩阵的深度优先递归算法
#define MAXVEX 100
int visit[MAXVEX] = { 0 };
void DFS(MGraph G, int i)
{
cout << G.vexs[i] << " ";
visit[i] = 1;
for (int j = 0; j < G.numNodes; j++)
{
if (!visit[j] && G.arc[i][j] != 0)
{
DFS(G, j);
}
}
}
void DFST(MGraph G)
{
for (int i = 0; i < G.numNodes; i++)
visit[i] = 0;
for (int i = 1; i < G.numNodes; i++)
{
if(!visit[i])
DFS(G, i);
}
}
//打印邻接矩阵
void PrintGraph(MGraph G)
{
int len = G.numNodes;
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
{
cout << G.arc[i][j] << " ";
}
cout << endl;
}
}
//邻接矩阵的广度优先遍历算法
void BFS(MGraph G)
{
queue<vextype> Q;
for (int i = 0; i < G.numNodes; i++)
visit[i] = 0;
for (int i = 0; i < G.numNodes; i++)
{
if (!visit[i])
{
visit[i] = 1;
cout << G.vexs[i] << " ";
Q.push(i);
while (!Q.empty()){
Q.pop();
for (int j = 0; j < G.numNodes; j++)
if (G.arc[i][j] != 0 && visit[j] == 0)
{
visit[j] = 1;
cout << G.vexs[j] << " ";
Q.push(j);
}
}
}
}
}
int main()
{
MGraph G;
CreatGraph(G);
cout << "打印邻接矩阵" << endl;
PrintGraph(G);
cout << "该邻接矩阵的深度优先遍历结果为:" << endl;
DFST(G);
cout << "\n该邻接矩阵的广度优先遍历结果为:" << endl;
BFS(G);
}
测试结果