题意:
给定一个有向图,设1到n的最短路径长度为d,问有多少从1到n长度在d~d+k(k给定)之间的路径(mod p)。
题解:
先两遍Dijkstra或SPFA算出最短路径树,然后在最短路径树上拓扑排序,若不能排序(意味着有0环)则有无数条满足要求的路径,否则排完序后按拓扑序DP得到答案。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <queue>
#include <vector>
#include <stack>
using namespace std;
const int MAXN = 100005;
const int MAXM = 200005;
const int INF = 1000000001;
struct Edge
{
int to;
int len;
int pre;
int next;
}edge[2][MAXM];
int T,n,m,K,p,id[2];
int head,tail;
int first[2][MAXN];
int dist[2][MAXN];
int seq[MAXN];
int degree[MAXN];
int f[MAXN][55];
bool mark[MAXN];
stack<int> S;
void addE(bool dir,int u,int v,int c)
{
edge[dir][edge[dir][first[dir][u]].pre = ++id[dir]] = (Edge){v