最短路 + 记忆化

记忆化搜索更容易实现


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue> using namespace std;
const int N = 1e5 + 10, M = 2e5 + 10;
const int oo = (1 << 30); int head1[N], head2[N], cnt;
struct Node {int v, w, nxt;} G1[M], G2[M]; #define gc getchar()
inline int read() {int x = 0; char c = gc; while(c < '0' || c > '9') c = gc;
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc; return x;}
#undef gc int n, m, k, Mod;
int dis[N];
bool vis[N];
int f[N][55];
bool c[N][55]; inline void Link(int u, int v, int w) {
++ cnt;
G1[cnt].v = v, G1[cnt].w = w, G1[cnt].nxt = head1[u], head1[u] = cnt;
swap(u, v);
G2[cnt].v = v, G2[cnt].w = w, G2[cnt].nxt = head2[u], head2[u] = cnt;
} void Init() {
cnt = 0;
for(int i = 1; i <= n; i ++) head1[i] = head2[i] = -1;
memset(f, -1, sizeof f);
memset(c, 0, sizeof c);
for(int i = 1; i <= m; i ++) {
int u = read(), v = read(), w = read();
Link(u, v, w);
}
} int Q[N << 2]; struct Node_ {
int u, dis_;
bool operator < (Node_ a) const {
return dis_ > a.dis_;
}
}; priority_queue <Node_> Que; void Dij() {
for(int i = 1; i <= n; i ++) vis[i] = 0, dis[i] = oo;
dis[1] = 0;
Que.push((Node_) {1, 0});
while(!Que.empty()) {
Node_ top_ = Que.top();
Que.pop();
if(vis[top_.u]) continue;
vis[top_.u] = 1;
int u = top_.u;
for(int i = head1[u]; ~ i; i = G1[i].nxt) {
int v = G1[i].v;
if(dis[v] > dis[u] + G1[i].w) {
dis[v] = dis[u] + G1[i].w;
Que.push((Node_) {v, dis[v]});
}
}
}
} bool flag; int Dp(int u, int K) {
if(flag == 0) return 0;
if(~ f[u][K]) return f[u][K];
f[u][K] = 0, c[u][K] = 1;
for(int i = head2[u]; ~ i; i = G2[i].nxt) {
int v = G2[i].v;
int t = dis[u] + K - dis[v] - G2[i].w;
if(t < 0) continue;
if(c[v][t]) {flag = 0; return 0;}
(f[u][K] += Dp(v, t)) %= Mod;
}
c[u][K] = 0;
return f[u][K];
} void Solve() {
Dij();
f[1][0] = 1;
int Ans = 0;
flag = 1;
for(int i = 0; i <= k; i ++) {
(Ans += Dp(n, i)) %= Mod;
if(flag == 0) {
cout << "-1" << "\n";
return ;
}
}
cout << Ans << "\n";
} int main() {
for(int T = read(); T; T --) {
n = read(), m = read(), k = read(), Mod = read();
Init();
Solve();
}
return 0;
}

loj #2316的更多相关文章

  1. [Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086

    额... 首先,看到这道题,第一想法就是二分答案+线段树... 兴高采烈的认为我一定能AC,之后发现n是500000... nlog^2=80%,亲测可过... 由于答案是求满足题意的最大长度-最小长 ...

  2. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  3. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  4. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  5. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  6. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  7. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  8. 【LOJ#3097】[SNOI2019]通信(费用流)

    [LOJ#3097][SNOI2019]通信(费用流) 题面 LOJ 题解 暴力就直接连\(O(n^2)\)条边. 然后分治/主席树优化连边就行了. 抄zsy代码,zsy代码是真的短 #include ...

  9. 【LOJ#3096】[SNOI2019]数论

    [LOJ#3096][SNOI2019]数论 题面 LOJ 题解 考虑枚举一个\(A\),然后考虑有多少个合法的\(B\). 首先这个数可以写成\(a_i+kP\)的形式,那么它模\(Q\)的值成环. ...

随机推荐

  1. Python 命令行模块使用技巧

    命令行参数传递 python main.py -H 192.168.1.1 -p 22,23,24 #coding:utf-8 import optparse def PortScan(host,po ...

  2. 微信小程序使用 iconfont

    小程序中使用 iconfont 在 iconfont.cn 中下载图标库, 直接将其中的 iconfont.css 复制到小程序目录中,并将扩展名改为 wxss: 在使用时在对应的样式文件 wxss ...

  3. 在论坛中出现的比较难的sql问题:35(时间间隔计算问题)

    原文:在论坛中出现的比较难的sql问题:35(时间间隔计算问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  4. Oracle触发器编译错误及解决方案

    错误 TRIGGER **** 编译错误 错误:PLS-00103: 出现符号 "END"在需要下列之一时:        ( begin case declare exit    ...

  5. netcore使用EFcore(第一个实例)

    说明:搭建netcore 使用efcore入门教程,跟着这个教程,傻瓜都可以成功!O(∩_∩)O哈哈~,咱们开始吧: 首先介绍下环境: vs2017, netcore2.2, EntityFramew ...

  6. 8. Java的运算符

    计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量. 我们把运算符具体分为:算数运算符,比较运算符,逻辑运算符,位运算符,赋值运算符,条件运算符,i ...

  7. BASIS小问题汇总1

    try to start SAP system but failed 2019-04-04 Symptom: when i tried to start SAP system, using the c ...

  8. FreeRTOS 任务创建和删除(静态)

    #define configSUPPORT_STATIC_ALLOCATION 1 //打开静态方法 StackType_t TaskStackBuffer[50]; //任务堆栈大小 StaticT ...

  9. spark 机器学习 knn原理(一)

    1.knnK最近邻(k-Nearest  Neighbor,KNN)分类算法,在给定一个已经做好分类的数据集之后,k近邻可以学习其中的分类信息,并可以自动地给未来没有分类的数据分好类.我们可以把用户分 ...

  10. 记录java+testng运行selenium(二)---定义元素类及浏览器

    一: 元素类 整体思路: 1. 根据状态可分可见和不可见两种 2. 同一个路径可以查找单个元素或多个元素 3. 获取元素text或者指定的value值 4. selenium对元素操作有两种,一是通过 ...