• 链式前向星


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

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

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

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

    所以在邻接表的思想上使用了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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    poj 2443
    codeforces 263D
    codeforces 263C
    uva 11080
    uva 11235
    uva 11748
    STL uva 11991
    (KM) uva 11383
    (树形DP) uva 10859
    codeforces 242C
  • 原文地址:https://www.cnblogs.com/sunjianzhao/p/13474213.html
Copyright © 2020-2023  润新知