链式前向星(C++)
Posted iuk11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链式前向星(C++)相关的知识,希望对你有一定的参考价值。
因为在图论中总会遇到存图的情况,如果用矩阵进行存储,相当于需要开辟 点 的平方的空间,但采用链式前向星,有多少条边开辟多少空间,更节省空间。
两种表达方式:
- 用
t
o
p
=
0
top=0
top=0 存第一条边,边的个数范围为
[
0
,
m
−
1
]
[0,m-1]
[0,m−1]
此时需要把头数组初始化为-1,memset(head,-1,sizeof(head)
且在对某一点进行枚举边时(看该点与哪些点相连),应该写成for(int j=head[i];~j;j=edge[i].next
代表若下一条边的头是-1退出,没有边了。 - 用
t
o
p
=
1
top=1
top=1 存第一条边,边的个数范围为
[
1
,
m
]
[1,m]
[1,m]
此时需要把头数组初始化为0,memset(head,0,sizeof(head)
且在对某一点进行枚举边时(看该点与哪些点相连),应该写成for(int j=head[i];j;j=edge[i].next
代表若下一条边的头是0退出,没有边了。
在代码中呈现:
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
struct node{
int to,next;
int val;//可以给边带权
}edge[maxn];
int head[maxn],top;
//head[i] 表示以i为起点的边分别对应的是第head[i]条边
//top 边的编号
int n,m;
//点数 边数
void init(){
memset(head,-1,sizeof(head));
top=0;
}
void add(int u,int v,int w){
edge[top].to=v;//第top条边的终点
edge[top].next=head[u];//上一条(head[u])的边的编号 因为下面要更新了 所以要先存下来 方便后面对u点遍历
edge[top].val=w;//存值
head[u]=top++;//存第u个点(起点)最后一次出现在第top条边上
}
int main(){
init();
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,w;
cin>>x>>y>>w;
add(x,y,w);//单向边
add(y,x,w);//双向边
}
for(int i=1;i<=n;i++){
for(int j=head[i];~j;j=edge[j].next){
//从第i个点的最后一条边往前推
int d=edge[j].to;//该边的终点
}
}
return 0;
}
总结:链式前向星的存储是以边为基础,会存每个点通过编号(top)的边与点(edge[j].to)相连。已知点u,就可以通过链式前向星得到与u点连接的所有点,也可以得到两点间的边权。
尴尬,一开始写的是邻接表,百度发现还是有区别的,链式前向星是提前知道边的数量,提前开辟好内存的静态型;邻接表是动态型,更灵活,但相较前者比较难写。
以上是关于链式前向星(C++)的主要内容,如果未能解决你的问题,请参考以下文章