链式前向星(C++)

因为在图论中总会遇到存图的情况,如果用矩阵进行存储,相当于需要开辟 的平方的空间,但采用链式前向星,有多少条边开辟多少空间,更节省空间。


两种表达方式:

  • t o p = 0 top=0 top=0 存第一条边,边的个数范围为 [ 0 , m − 1 ] [0,m-1] [0,m1]
    此时需要把头数组初始化为-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点连接的所有点,也可以得到两点间的边权。


尴尬,一开始写的是邻接表,百度发现还是有区别的,链式前向星是提前知道边的数量,提前开辟好内存的静态型;邻接表是动态型,更灵活,但相较前者比较难写。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值