前言
图论的基础就是存图,存图的方式有许多种,一般就三种:邻接矩阵,邻接表,链式前向星。
一、邻接矩阵
邻接矩阵的简单来说就是一个数组两个端点的下标就是这条边的起始端点和最终端点,可以直接用下标访问,存边的时间复杂度和调用此边的复杂度都为O(1),但是缺点在于他的空间复杂度为O(n²),只能存小图以及存稀疏图空间浪费太大
1.声明邻接矩阵
int maps[maxn][maxn];
2.使用邻接矩阵存边
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
maps[u][v]=w;
二、邻接表
邻接表就是一个链表大致样子如图所示(该图引用至百度百科)
1.邻接表的使用
struct Node{
int to,w;
Node(int _to,int _w){
to=_to;w=_w;
}
};
vector<Node>maps[maxn];
void add()
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
maps[u].push_back(Node(v,w));
}
三、链式前向星
链式前向星也是一种类似于邻接表的结构,如图(该图来自百度图片)
1.链式前向星的使用
struct Edge{
int to,w,next;
}e[maxm];
int head[maxn],cnt=0;
void add(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
}
void solve()
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
总结
三种常见的存图方式,各有各的缺点和有点。
1、邻接矩阵的存图快,调用快,但是耗费空间多并且不适合存端点较多的图
2、链式前向星适合点多、边少的情况,不适用于大量遍历出边的题目
3、如果用邻接表来实现的话,一般就用vector嘛,我们都知道vector都是自动扩容的,在空间满了以后,就自动申请多一倍空间。