22计算机408考研—数据结构—邻接矩阵

144 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 有一条边联系,反之则没有边联系)

img

img

​ **对角线上的都是0:**都是对应当前点(V0,V0 V1,V1 ……)顶点是无法自身与自身相连接的

​ 对于无向图来说,其实他们是关于对角线对称的ij相连,那么ji肯定也是相连的)

​ 对于有向图来说,没有这个规律 ( ij相连,那么ji不一定相连)

​ 网G,邻接矩阵可以定义为如下(其实和图是一样的,不过就是把顶点有关系变成了顶点直接的权值)

​ A[ i,j] = 3 表示顶点 i 和顶点 j 有一条边,边的权值为3

img

img

​ 和图一样,对角线上一定为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