持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第32天,点击查看活动详情
手把手教学考研大纲范围内图的存储和遍历 22考研大纲数据结构要求的是C/C++,笔者以前使用的都是Java,对于C++还很欠缺, 如有什么建议或者不足欢迎大佬评论区或者私信指出 初心是用最简单的语言描述数据结构
Talk is cheap. Show me the code. 理论到处都有,代码加例题自己练习才能真的学会
2.1、邻接矩阵
邻接矩阵: 顶点之间相邻关系的矩阵。
图
图G(V,E)是具有 n 个顶点的图(A[ i,j] = 1表示顶点 i 和顶点 j 有一条边联系,反之则没有边联系)
**对角线上的都是0:**都是对应当前点(V0,V0 V1,V1 ……)顶点是无法自身与自身相连接的
对于无向图来说,其实他们是关于对角线对称的( i 与j相连,那么j与i肯定也是相连的)
对于有向图来说,没有这个规律 ( i 与j相连,那么j与i不一定相连)
网
网G,邻接矩阵可以定义为如下(其实和图是一样的,不过就是把顶点有关系变成了顶点直接的权值)
A[ i,j] = 3 表示顶点 i 和顶点 j 有一条边,边的权值为3
和图一样,对角线上一定为0,顶点无法与自身相连接
邻接矩阵示例代码
代码:
(无向图也可以这么创建,无向图就不需要输入权值了,把相关联的两个点在矩阵中置1)
#include <iostream>
using namespace std;
#define None 0 //顶点之间没有关系用0表示
#define MAXNum 100 //设图中顶点数量最多为100
typedef struct { //图的结构体:顶点列表,邻接矩阵,图的点数和边数
int nodes[MAXNum];
int arcs[MAXNum][MAXNum];
int vewnum, arcnum;
} AMGraph;
//取顶点在顶点表中的下标
int getAMGraphIndex(AMGraph G, int node) {
for (int i = 0; i < G.vewnum; i++) { //循环顶点表,找到顶点,返回下标
if (G.nodes[i] == node) {
return i;
}
}
return -1;
}
//邻接矩阵法创建无向图
bool createAMGraph (AMGraph &G) {
cout << "请输入顶点数量和边的数量" << endl;
cin >> G.vewnum >> G.arcnum; //输入 顶点数 和 边数
for (int i = 0; i < G.vewnum; i++) { //输入顶点
cout << "请输入顶点的值" << endl;
cin >> G.nodes[i];
}
for (int i = 0; i < G.vewnum; i++) { //邻接矩阵,初始化顶点间的边(关系)都为空
for (int j = 0; j < G.vewnum; j++) {
G.arcs[i][j] = None;
}
}
int v1, v2, w;
int i1, i2;
for (int i = 0; i < G.arcnum; i++) { //接收两个顶点和顶点间边的权值
cout << "请输入新建边相邻的两个结点,以及这条边的权重" << endl;
cin >> v1 >> v2 >> w;
i1 = getAMGraphIndex(G, v1); //找到两个顶点的下标
i2 = getAMGraphIndex(G, v2);
G.arcs[i1][i2] = G.arcs[i2][i1] = w; //在邻接矩阵中建立关系
}
return true;
}
//输出图
void printAMGraph(AMGraph G) {
cout << "顶点数:" << G.vewnum << "边数:" << G.arcnum << "\n";
cout << "顶点表:";
for (int i = 0; i < G.vewnum; i++) {
cout << G.nodes[i] << " ";
}
cout << "\n";
cout << "邻接矩阵关系(A[i,j] = 3 表示顶点 i 和顶点 j 有一条边,边的权值为3):\n";
for (int i = 0; i < G.vewnum; i++) {
for (int j = 0; j < G.vewnum; j++) {
cout << G.arcs[i][j] << " ";
}
cout << "\n";
}
cout << "\n";
}
int main() {
AMGraph G;
//输入例子
//5 6 1 2 3 4 5 1 5 8 1 3 6 1 4 9 2 3 8 5 4 9 3 4 6
createAMGraph(G);
printAMGraph(G);
return 0;
}
输入输出样例:
/home/a1439775520/CLionProjects/Graph/cmake-build-debug/Graph
请输入顶点数量和边的数量
5 6
请输入顶点的值
1
请输入顶点的值
2
请输入顶点的值
3
请输入顶点的值
4
请输入顶点的值
5
请输入新建边相邻的两个结点,以及这条边的权重
1 5 8
请输入新建边相邻的两个结点,以及这条边的权重
1 3 6
请输入新建边相邻的两个结点,以及这条边的权重
1 4 9
请输入新建边相邻的两个结点,以及这条边的权重
2 3 8
请输入新建边相邻的两个结点,以及这条边的权重
5 4 9
请输入新建边相邻的两个结点,以及这条边的权重
3 4 6
顶点数:5边数:6
顶点表:1 2 3 4 5
邻接矩阵关系(A[i,j] = 3 表示顶点 i 和顶点 j 有一条边,边的权值为3):
0 0 6 9 8
0 0 8 0 0
6 8 0 6 0
9 0 6 0 9
8 0 0 9 0
Process finished with exit code 0