Description

给出一个 n 个顶点 m 条边的无向无权图,顶点编号为 1 到 n。

问从顶点 1 开始,到其他每个点的最短路有几条。

Input

第一行 2 个正整数 n, m  ( 1 ≤ n ≤ 105 ,  1 ≤ m ≤ 2×105 ) ,为图的顶点数与边数。

接下来 m 行,每行两个正整数 x, y,表示有一条顶点 x 连向顶点 y 的边,请注意可能有自环与重边。

Output

n 行,每行一个非负整数,第 i 行输出从顶点 1 到顶点 i 有多少条不同的最短路,由于答案有可能会很大,你只需要输出对 100003 取模后的结果即可。

如果无法到达顶点 i 则输出 0。

Sample Input

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

Sample Output

1
1
1
2
4

首先这道题目求的是最短路的数量
我们考虑用dp计算方案数,
设dist[i]数组记录从起点到各节点的最短路径
设cnt[i]数组记录从起点到各节点最短路径的数量

当我们在求最短路枚举邻边时:
如果dist[j]>dist[t]+w[i],那么更新dist[j]后,cnt[j]=cnt[t]
如果dist[j]=dist[t]+w[i],说明j的最短路已经被更新过了,现在又出现了和最短路相等的路径,所以cnt[j]=cnt[j]+cnt[t]

而dp要求状态转移的关系必须满足一个性质:每个状态所依赖的子集里的各种情况都必须枚举考虑到,保证当前状态最优后再去更新其它状态

求最短路的算法有bfs,dijkstra,Bellman_ford(spfa),我们逐个分析是否满足dp特性:
bfs算法是每次往外扩一层的,每个状态的子集都有被考虑到,因此满足性质,可以使用
dijkstra算法每次都是用已经确定的最短路去更新其它状态,因此每个状态都是由最优状态去更新的,满足性质,可以使用
spfa算法会出现 当前状态的子集没有全部考虑到就更新其它状态 的情况,所以不满足性质

spfa举例如下:

在这个图里有两条长度相等的路径,d节点的最短路径数量为2
如果用spfa算法的话:
a节点会首先更新c节点,因为dist[c]>dist[a]+w[i],所以cnt[c]=cnt[a]=1
其次c节点更新d节点,因为dist[d]>dist[c]+w[i],所以cnt[d]=cnt[c]=1
而路径1节点多,走的较慢,当枚举到b时,因为dist[c]=dist[b]+w[i],所以cnt[c]=cnt[c]+cnt[b]=2,但是这个时候c节点的dist[c]没有被更新,所以无法入队,导致d节点没办法被再次更新,最终cnt[d]=1是错的

在这个例子中,c没有考虑a和b后再去更新d,而是只考虑了a就去更新d,违法了“每个状态所依赖的子集必须先算出来再去更新其它状态”的dp特性,没有用最优状态去更新d,所以是错的

如果题目里出现负权边,就舍弃dijkstra算法用bfs求即可

附上bfs代码:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
#define N 100020
#define M 400020
#define mod 100003int h[N], e[M], ne[M], idx;
void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}int n, m;
int dist[N], st[N], cnt[N];
void bfs() {memset(dist, 0x3f, sizeof dist);memset(st, 0, sizeof st);dist[1] = 0; cnt[1] = 1;queue<int>q;q.push(1);while (q.size()) {int t = q.front();q.pop();for (int i = h[t]; i != -1; i = ne[i]) {int j = e[i];if (dist[j] > dist[t] + 1) {dist[j] = dist[t] + 1;cnt[j] = cnt[t];q.push(j);}else if (dist[j] == dist[t] + 1)cnt[j] = (cnt[j] + cnt[t]) % mod;}}
}int main() {memset(h, -1, sizeof h);scanf("%d%d", &n, &m);int a, b;for (int i = 0; i < m; i++) {scanf("%d%d", &a, &b);add(a, b); add(b, a);}bfs();for (int i = 1; i <= n; i++)printf("%d\n", cnt[i]);return 0;
}

最短路计数(dp+最短路)相关推荐

  1. 最短路计数(入门最短路)

    题目: 给出一个N个顶点MMM条边的无向无权图,顶点编号为1−N.问从顶点1开始,到其他每个点的最短路有几条. 思路: 此题由于边权值可都为1,所以可以不需要SPFA或者迪杰斯拉,只需用BFS即可. ...

  2. BZOJ1491: [NOI2007]社交网络(Floyd 最短路计数)

    Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2343  Solved: 1266 [Submit][Status][Discuss] Descrip ...

  3. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...

  4. 1491. [NOI2007]社交网络【最短路计数】

    Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这 ...

  5. 2018.11.05 NOIP模拟 规避(最短路计数)

    传送门 正难则反. 考虑计算两人相遇的方案数. 先正反跑一遍最短路计数. 然后对于一条在最短路上的边(u,v)(u,v)(u,v),如果(dis(s,u)*2<total&&di ...

  6. nssl1338-逃亡路径【最短路计数,bfs】

    正题 题目大意 n∗mn*mn∗m的格子,一个走"日"字形的马,从(1,1)(1,1)(1,1)走到(n,m)(n,m)(n,m)的最短路条数. 解题思路 模板最短路计数改一下即可 ...

  7. [图论]最短路计数(spfa)

    最短路计数 Description 给出一个NN个顶点MM条边的无向无权图,顶点编号为1-N1−N.问从顶点11开始,到其他每个点的最短路有几条. Input 第一行包含22个正整数N,MN,M,为图 ...

  8. poj3463 最短路和次短路 计数

    这道题就是让你求出有向图中最短路和比最短路长1的路的数量, 我们求出次短路和最短路的数量即可解决这道题 /* 求s到t的最短路与次短路(这里要求只比最短路多1)的条数之和 联想到最小,次小的一种更新关 ...

  9. 洛谷 1144 最短路计数 bfs

    洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...

  10. 最短路——最短路计数(spfa)

    题目链接 最短路--最短路计数(spfa) 题目描述 给出一个 N 个顶点 M 条边的无向无权图,顶点编号为 1-N.问从顶点 1 开始,到其他每个点的最短路有几条. 输入格式 第一行包含 2 个正整 ...

最新文章

  1. QIIME 2教程. 15样品分类和回归q2-sample-classifier(2020.11)
  2. python 贴吧自动回复机-用python itchat写一个微信机器人自动回复
  3. android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件
  4. oracle 并行执行脚本,批量执行Oracle脚本
  5. php远程读取几行文件,PHP读取远程文件的三种方法
  6. 【codevs1174】 靶形数独,暴力解决问题
  7. g6-editor 使用
  8. 八家顶级无人车公司首次披露故障详情,从百度到Waymo
  9. 逻辑卷管理和磁盘配额
  10. 自动驾驶仿真:Carsim、NI和VTD联合仿真课题一
  11. clientHeight、offsetHeight、innerHeight、ouerHeight 区别
  12. 自定义Popwindow
  13. Matlab导出高DPI图像——生成高分辨率.eps .tiff .jpg图像的方法
  14. 如何用 Python 快速开发一个网站
  15. 黑帆第一季/全集Black Sails迅雷下载
  16. 以推理游戏开始2007年吧!
  17. 阿里云OCR通用文字识别和自定义模板OCR识别Python代码及一站式教程
  18. 在Ubuntu下载Python3.6.2并建立软连接
  19. GO学习笔记1.5:第一个GO项目常见问题
  20. 乐高拉力机器人图纸_乐高MOC图纸分享:乐高MINI机器人制作教程(图文版)

热门文章

  1. java分页(java分页插件pagehelper)
  2. vscode 下载 安装
  3. android ui所见退所得,为什么我的android studio不能所见既所得
  4. 深度学习 | BN层原理浅谈
  5. 进程、线程、协程和管程
  6. python机器人开发——基于Micropython的智能机器人底层控制开发
  7. spring boot and php
  8. plc输出类型有哪些?
  9. swift 加速传感器
  10. 适合编程初学者的开源博客系统