链式前向星

存储图的信息时,一般需要存储的是边的信息。

边的信息:两个结点,权值

一般的方式包含:邻接矩阵、邻接表

通常而言邻接表是指的用链表实现的。但是链表存在的问题是非常容易出错。

所以在邻接表的思想上使用了vector存储和链式前向星

模板代码

int cnt=0; 
int head[N];//链式前向星 
struct st{
    int from,to,next,dis;
}edge[N*N];

//这里实际存储的是有向边,如果存储无向边时,可以addedge(u,v,w);addedge(v,u,w);
//所以存储无向边时,edge数组的大小是图的边数*2 
void addedge(int u,int v,int w){//链式前向星添加边。其实就是一个数组模拟链表,并且新加的边都放在了结点头之后 
    cnt++;
    edge[cnt].from=u;//有向边的开始结点 
    edge[cnt].to=v;//有向边的结束结点 
    edge[cnt].dis=w;//有向边的权值 
    edge[cnt].next=head[u];//将这条有向边直接放在头结点head[u]之后 
    head[u]=cnt;//更改头结点,此时头结点的后面已经改变了 
}
//遍历结点u所连的边时 
for(int i=head[u];i;i=edge[i].next){
    int v=edge[i].to;//u所连的边的另一个结点
    int w=edge[i].dis;//这条边的权值
    int ne=edge[i].next;//因为是基于链表的思想,所以next存储的下一条u开始的边的编号(也就是edge[]的下标) 
}

一般而言链式前向星是最好的存储图的方式,比vector稍微好一点。只要出题者不故意卡,vector就可以通过。

写于:2020/8/11 10:50


作者:孙建钊
出处:http://www.cnblogs.com/sunjianzhao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/sunjianzhao/p/13474213.html