图论加边算法--链式向前星

很多图论的算法都有一个函数

struct Edge {
    int to;
    int w;
    int next;
} edge[N * 2];

int cnt_edge = 0;

void add_edge(int from, int to, int w)
{
    edge[cnt_edge].to = to;
    edge[cnt_edge].w = w;
    edge[cnt_edge].next = head[from];
    head[from] = cnt_edge++;
}

memset(head, -1, sizeof head);

我纠结了好久这个函数的意思……

实际上是用邻接表存一个图。

cnt_edge是给每一个边标号,从0开始。

edge[i].to 表示第i条边指向哪个点,edge[i].next表示第i条边的下一条边的序号。

head[from]表示以第from为初始结点的边的序号。

例如图(随便画的= =#):

存在边1,3   1,4   2,5   2,6   4,3   5,3  六条边

依次调用函数add_edge之后,可以得到

edge[0].to=3; edge[0].next=-1; head[1]=0;

edge[1].to=4; edge[1].next=0; head[1]=1;

edge[2].to=5; edge[2].next=-1; head[2]=2;

edge[3].to=6; edge[3].next=2; head[2]=3;

edge[4].to=3; edge[4].next=-1; head[4]=4;

edge[5].to=3; edge[5].next=-1; head[5]=5;

用图来表示就是:

喵。箭头的方向该怎么画呢。

 

虽然vector建图会方便许多,但是碰到恶心的卡stl的题就gg了。所以还是要学一下链表建图。

多写几次就很熟练了。

 

转载于:https://www.cnblogs.com/wenruo/p/4680930.html

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值