数据结构-邻接矩阵

介绍

邻接矩阵,是表示图的一种常见方式,具体表现为一个记录了各顶点连接情况的呈正方形的矩阵。

假设一共有以下顶点,其连接关系如图所示

那么,怎么表示它们之间的连接关系呢?

我们发现,各条边所连接的都是两个顶点,联想到我们之前学过的能表示两个量直接关系的数据结构,二维数组就是一个不错的选择。

如果i,j两个节点之间存在边联系它们,那么就将graph[i][j]值记为1,如果不存在边联系它们,就记为0.

这样一来,可以表示图中节点关系的邻接矩阵可以具象化为:

由于例图为无向图(即各顶点间路径没有具体指向),所以graph[i][j]与graph[j][i]的值相同,有向图中则需要将两个值单独判断

具体实现

根据输入的各条边的信息(即两个顶点)可以生成邻接矩阵

复制代码
    cin>>n>>m;
    for (int i=0;i<n;i++) {
        for (int j=0;j<n;j++) {
            graph[i][j]=0;//初始化邻接矩阵
        }
    }
    for (int i=0;i<m;i++) {
        int u,v;
        cin>>u>>v;//读入边信息,更新邻接矩阵
        graph[u][v]=1;
        graph[v][u]=1; //如果是无向图,则还要更新graph[v][u]
    }
    for (int i=0;i<n;i++) {// 输出邻接矩阵
        for (int j=0;j<n;j++) {
            cout<<graph[i][j]<< " ";
        }
        cout<<endl;
    }

根据邻接矩阵来实现各顶点相邻顶点的输出

1)借助结构体来方便记录各顶点的相邻情况

复制代码
#define MAXN 100 // 最大顶点数
int graph[MAXN][MAXN]; // 邻接矩阵
struct Node{
    int value;
    int num;//记录相邻顶点数目
    Node** neib;//记录相邻顶点
};

2)遍历邻接矩阵,将相邻的顶点添入结构体内,记录相邻顶点

复制代码
Node* init(int v) {//初始化顶点信息
    Node* temp=(Node*)malloc(sizeof(Node));
    temp->value=v;
    temp->num=0;//邻居数开始为0
    temp->neib=NULL;//记录邻居的指针一开始为空
    return temp;
}
Node** generateGraph() {
    Node** nodes=(Node**)malloc(n*sizeof(Node*));//为结构体分配空间储存每个顶点信息
    for (int i=0; i<=n; i++) {
        nodes[i]=init(i);//初始化每一个顶点代表的结构体
    }
    for (int i=0; i<=n; i++) {
        for (int j=i; j<=n; j++) {
            if (graph[i][j]==1) {//如果两个顶点相邻
                addNeighbor(nodes[i],nodes[j]);
                addNeighbor(nodes[j],nodes[i]); // 无向图需要更新nodes[j]->neib
                m++;
            }
        }
    }
    return nodes;
}

3)为邻接矩阵中为1的两个顶点更新邻居信息

复制代码
void addNeighbor(Node* temp,Node* neighbor) {
    temp->num++;//邻居数增加
//重新分配指针内存,增加指针数,用来指向新的邻居
    temp->neib=(Node**) realloc(temp->neib,temp->num*sizeof(Node*));
    temp->neib[temp->num-1]=neighbor;//记录新邻居地址
}

这里用realloc来重新分配内存空间

malloc与realloc的不同:

malloc:用于申请一块指定大小的内存空间,并返回指向该空间的地址

realloc:接受两个参数:旧的内存指针与新的大小,用于重新调整一个已经分配完空间的内存大小,并可以将原空间的内容复制到新开辟的空间中,同时释放原内存

4)输出顶点信息

复制代码
for (int i=0;i<=n;i++) {
        cout<<nodes[i]->value)<<":";
        for (int j=0;j<=nodes[i]->num;j++) {//输出所有相邻顶点
            cout<<nodes[i]->neib[j]->value<<" ";
        }
        cout<<endl;
    }
相关推荐
ゞ 正在缓冲99%…9 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong10 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
惊鸿.Jh29 分钟前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode
明灯L29 分钟前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题
碳基学AI35 分钟前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义免费下载方法
大数据·人工智能·python·gpt·算法·语言模型·集成学习
补三补四39 分钟前
机器学习-聚类分析算法
人工智能·深度学习·算法·机器学习
独好紫罗兰1 小时前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法
正脉科工 CAE仿真1 小时前
基于ANSYS 概率设计和APDL编程的结构可靠性设计分析
人工智能·python·算法
爱喝热水的呀哈喽1 小时前
Java 集合 Map Stream流
数据结构
Dovis(誓平步青云)1 小时前
【数据结构】排序算法(中篇)·处理大数据的精妙
c语言·数据结构·算法·排序算法·学习方法