CDOJ 1147 秋实大哥带我飞 最短路径条数 dijkstra就可搞

啊,就是说给你一个图,让你求从1到n的最短路径条数,模1e9+7

图的边权可能为0或者正数,边和点都可以重复走

最短路径条数为无穷则输出-1

啊,那个边权全为正的情况好说,边和点也不可能重复走

就是如果边权为0的话,它可以沿着这个边无限次数的来回走,然后就是无穷了

嗯,看题解什么队列搞阿,网上搜了都是DFS,,后来感觉dijkstra就可以搞阿,,看到网上果然有一个这么搞的,代码太丑就没看了,自己YY了一下就来写了

dijkstra时,我们是先更新离它最近的点,然后逐个点逐个点的搞,相当于只要是我们这次遍历到的点,它的最短路就已经求出来了,但是它也会往别的点上去更新,所以我们就可以记录它的最短路径数,并在它更新时,扩散出去

首先,假如起点是s,ways[s]=1,自己到自己肯定只有一条路嘛,这样也方便后面更新

然后,就是,每当我们dist[v] > dist[u] + edge[i].w这个不等式成立时,我们就说明找到了到v的一条更短的路,所以ways[v]=ways[u]

然后,我们在更新时不仅要判大于,还有判等于,dist[v] == dist[u] + edge[i].w时,ways[v]+=ways[u],到v的路径多了那么多条

然后,就没了,但是这道题有边权为0的情况,怎么办呢,就在两个更新处判一下,边权为0时直接记为-1,后

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值