以前向星方式存储一个有向图打基本信息

本文介绍了一种称为“前向星”的数据结构,用于高效地存储有向图的边集合。通过使用链表的方式存储边的信息,可以方便地进行图的遍历操作。文章详细解释了前向星的基本概念、构造方法及其应用场景。

      前向星:是一种数据结构,以储存边打方式来存储图。构造方法,读入每条边的信息将边存放在数组中把数组中的边按照起点顺序排序排序,前向星就构造完量。通常用在点的数目太多,或两点之间有多条弧的时候。一般在别的数据结构不能使用的时候才考虑用前向星。除了不能直接用起点终点定位以外,前向星几乎是完美的。

      「·任务·」

      以前向星方式存储一个有向图打基本信息

      「·说明·」

      使用链表方式存储图的边。info[i]为节点i的边集所对应的链表的头指针,next[j]为第j条边的指向下一条边的指针,to[j]表示第j条边所指向的节点编号。即:令addr=info[i],之后不断用addr=next[addr]即可得到链表中节点i的所有边集的编号,其中to[addr]表示对应边指向的节点编号。

      「·接口·」

      结构体:graph

      成员变量:

               vector < int > info      由该点出发的所有边构成打链表

               vector < int > next     链表中下一条边在to数组中的位置

               vector < int > to         to[i]表示编号位i的边指向打节点

      「·代码·」


struct graph
{
    typedef vector<int> VI;
    VI info,next,to;
    graph (int n=0,int m=0) : to(0),next(0)
    {
        info.resize(n);
        next.reserve(m);
        to.reserve(m);
    }
    int edge_size()
    {
        return to.size();//返回边的数量
    }
    int vertex_size()
    {
        return info.size();//返回值为最大点打编号+1
    }
    void expand(int i)
    {
        if (info.size()<i+1)
            info.resize(i+1);
    }
    void add(int i,int j)//添加一条i到j的边
    {
        expand(i),expand(j);
        to.push_back(j);
        next.push_back(info[i]);
        info[i]=to.size()-1;
    }
    void del_back()//删除最后一次添加打边
    {
        int i;
        for (i=0;i<info.size();i++)
        {
            if (info[i]==to.size()-1)
            {
                info[i]=next.back();
                break;
            }
        }
        to.pop_back();
        next.pop_back();
    }
    void clear()//清空类图
    {
        info.clear();
        next.resize(0);
        to.resize(0);
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值