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已经死了