想请教一下关于最短路的计数

P2505 [HAOI2012] 道路

Gloid @ 2018-05-06 12:16:15

就是求这个起点到其他点的最短路数量的时候,究竟可不可以在SPFA中同时统计啊……为何在里面统计WA到吐血,改成求出最短路后再递推就A了呢

void spfa(int k)
{
    memset(d,42,sizeof(d));d[k]=0;
    memset(flag,0,sizeof(flag));
    memset(f,0,sizeof(f));f[k]=1;
    int head=0,tail=1;q[1]=k;
    do
    {
        int x=q[inc(head)];flag[x]=0;
        for (int i=p[x];i;i=edge[i].nxt)
        if (d[x]+edge[i].len<d[edge[i].to])
        {
            d[edge[i].to]=d[x]+edge[i].len;
            f[edge[i].to]=f[x];
            if (!flag[edge[i].to]) 
            {
                q[inc(tail)]=edge[i].to;
                flag[edge[i].to]=1;
            }
        }
        else if (d[x]+edge[i].len==d[edge[i].to]) 
        {
            inc(f[edge[i].to],f[x]);
            /*if (!flag[edge[i].to]) 
            {
                q[inc(tail)]=edge[i].to;
                flag[edge[i].to]=1;
            }*/
        }
    }while (head!=tail);
}

这是原本统计最短路数的代码,注释内删掉会少,不删会多 (发觉自己并没能完全搞懂最短路啊


by Gloid @ 2018-05-06 13:18:33

脑补一下好像觉得SPFA是有点问题……似乎dij可以?


by Gloid @ 2018-05-06 13:48:56

好的用dij过了


by 含笑半步癫 @ 2018-09-20 22:59:23

@Gloid 带权最短路计数不能用spfa


by 含笑半步癫 @ 2018-09-20 23:00:10

5 5 1 2 1 2 3 1 3 4 1 1 4 3 4 5 1 @Gloid


by 含笑半步癫 @ 2018-09-20 23:00:43

5 5 
1 2 1 
2 3 1 
3 4 1 
1 4 3 
4 5 1

by Gloid @ 2018-09-21 01:22:44

@含笑半步癫 是的(反正spfa已经死了


|