最短路径生成树:
([HAOI2012]道路)
题目描述
C国有n座城市,城市之间通过m条[b]单向[/b]道路连接。一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小。两条最短路不同,当且仅当它们包含的道路序列不同。我们需要对每条道路的重要性进行评估,评估方式为计算有多少条不同的最短路经过该道路。现在,这个任务交给了你。
输入输出格式
输入格式:
第一行包含两个正整数n、m
接下来m行每行包含三个正整数u、v、w,表示有一条从u到v长度为w的道路
输出格式:
输出应有m行,第i行包含一个数,代表经过第i条道路的最短路的数目对[b]1000000007取模[/b]后的结果
输入输出样例
输入样例#1:
4 4
1 2 5
2 3 5
3 4 5
1 4 8
输出样例#1:
2 3 2 1
说明
数据规模
30%的数据满足:n≤15、m≤30
60%的数据满足:n≤300、m≤1000
100%的数据满足:n≤1500、m≤5000、w≤10000
个人思路:
- 枚举源点S,跑最短路径生成树,在每次得到的DAG上进行拓扑排序计数即可(正向反向各一次,计数依据乘法原理)
题目地址:https://www.luogu.org/problemnew/show/P2573
参考代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
inline int read() {
int res = 0; bool bo = 0; char c;
while (((c = getchar()) < '0' || c > '9') && c != '-');
if (c == '-') bo = 1; else res = c - 48;
while ((c = getchar()) >= '0' && c <= '9')
res = (res << 3) + (res << 1) + (c - 48);
return bo ? ~res + 1 : res;
}
const int N = 1505, M = 5005, INF = 0x3f3f3f3f, PYZ = 1e9 + 7;
int n, m, ecnt, nxt[M], adj[N