链式前向星(C++)

Posted iuk11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链式前向星(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点连接的所有点,也可以得到两点间的边权。


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

以上是关于链式前向星(C++)的主要内容,如果未能解决你的问题,请参考以下文章

链式前向星

前向星和链式前向星

前向星链式前向星实现以及它的遍历

链式前向星

图的存储:链式前向星(边集数组)

链式前向星