B02 图的存储——信息学奥赛算法_哔哩哔哩_bilibili
图的存储方式¶
结构体邻接表(链式前向星)¶
请强记!
struct edge{
int v,c,nxt;
}e[N];
int h[N],idx;
void add(int a,int b,int w){
e[++idx]={b,w,h[a]};
h[a]=idx;
}
邻接表(链式前向星)¶
由以下3个数组组成
int h[],nxt[],to[]; //头,节点i(i为实际编号)的相邻节点在数组里的编号,节点i的相邻节点的实际编号
int cnt; //记录节点个数
存储
模拟一下(不一定准确)
插入前 | 插入9后(连接1,9) |
---|---|
h[1]=3 | h[1]=4 |
nxt={0,0,2} | nxt={0,0,2,3} |
cnt=3 | cnt=4 |
当访问1
的临边时,让i=h[1]
,然后不断v=to[i]
( v
是相邻的点的真实编号), i=nxt[i]
,直到nxt[i]
为空停止.
void add(int a, int b) {
to[++cnt] = b; //新建节点的目标
nxt[cnt] = h[a]; //头插法
h[a] = cnt; //接上
}
遍历
当我们要访问一个点的出边时,从i=h[i]
开始向下i=nxt[i]
,直到nxt[i]==0
int u=1; //u是目前节点的编号
for(int i=h[u],i;i=nxt[i]){}
邻接矩阵¶
建立矩阵web[a][b]
,如果web[a][b]==1
,则表示存在 $ a\to b$ 的路径
可按具体环境改变web[a][b]
存的内容
Vector存图¶
连边(无向图)
void add(int a,int b){
e[a].push_back(b);
e[b].push_back(a);
}
访问u的邻点
for(int i=0;i<e[u].size();i++){
int v=e[u][i];
}
//或者
for(int v:e[u]){
}
可以去学习一下:
的使用方法。同时了解一下auto
类型的使用方法。
对于有边权的情况,我们要么把vector定义为struct或者pair,要么开第二个vector来同步存其边权。