目录:
边的存储方法:
边的存储方法有:邻接矩阵,邻接表,数组模拟邻接表,链式前向星……
当前主流的存储方法是:邻接矩阵 和 链式前向星
邻接矩阵:
基本思想:用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系。
在 数据较小 或 用 Floyd算法 时,常用邻接矩阵,邻接矩阵在稠密图中表现得效率尤为高。
无向图的邻接矩阵一定是对称的,而有向图的邻接矩阵不一定对称。
邻接矩阵虽然简单,但是,邻接矩阵所需要的空间大小为,很多情况下时会爆空间的。
给大家一张图:

【代码实现】
//假设有n个点,m条边,求1~n的最短路径
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<cstring>
#include<queue>//头文件
int n,m;
int mapp[1001][1001];//存储图中的边权
int dian[1001];//存储途中点的信息
void clean()//初始化
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
{
mapp[i][j]=0;
}
else
{
mapp[i][j]=0x7f7f7f;
//mapp[i][j]=- 0x7f7f7f;
//初始为无穷大或无穷小,需要根据题目变通
}
}
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
clean();//初始化
for(int i=1;i<=n;i++)//读入点的信息,有些题目可能不需要读入点的信息
{
scanf("%d",&dian[i]);
}
for(int i=1;i<=m;i++)//读入边的信息
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
mapp[u][v]=w;//有向图
//mapp[u][v]=mapp[v][u]=w;无向图
}
}
链式前向星简介:
链式前向星是一种特殊的存储边的方式。链式前向星可以看作 " 带有索引数组的多个数据结构 " 构成的集合。在这样的结构中,存储的数据被分成若干类,每一类的数据结构构成一个链表,每一类还有一个代表元素,称为该类链表的 " 表头 " 。所有的 " 表头 " 构成一个表头数组,作为一个可以随机访问的索引,从而可以通过表头的数组定位到某一数据的对应的链表。
相对于邻接矩阵,链式前向星的应用范围更广。
给大家一张图:

【代码实现】
//假设有n个点,m条边
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<cstring>
#include<queue>//头文件
using namespace std;
int n,m;
int tot;//累加边数
struct node
{
int from;
int to;
int w;
}mapp[10001];
int head[10001];//记录头节点
void add(int u,int v,int w)//链式前向星存储边权
{
tot++;//边数累加
head[u]=tot;
mapp[tot].from=head[u];
mapp[tot].to=v;
mapp[tot].w=w;
return;
}
int main()
{
scanf("%d%d",&n,&m);//读入
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);//有向图
//add(u,v,w);//无向图
//add(v,u,w);//无向图
}
return 0;
}

本文介绍了C++中图的两种常见存储方式——邻接矩阵和链式前向星。邻接矩阵适用于稠密图,空间效率在数据较小或使用Floyd算法时较高,但可能会占用大量空间。链式前向星是一种更节省空间的存储方法,特别适合稀疏图,其结构包含多个链表,通过表头数组快速定位数据。


被折叠的 条评论
为什么被折叠?



