最短路 + 记忆化

记忆化搜索更容易实现


#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. 【HC89S003F4开发板】 7ASM&C混合编程

    HC89S003F4开发板ASM&C混合编程 一.前言 在配套资料里有实现ASM&C混合编程的说明文档,这里来实现这个功能. 二.实现ASM&C混合编程 1.打开 Keil 工 ...

  2. Bootsrap表格表单及其使用方法

    bootstrap的使用 bootstrap中的js插件依赖于jQuery 因此jQuery要在bootstrap之前引入 参考官网标准引入方法和引入样式 排版 标题 Bootstrap和普通的HTM ...

  3. stm32f103的低功耗开启和关闭

    stm32f103低功耗分为WFI等待中断和WFE等待事件,我只用到等待中断,这里没有细究. 待机模式最低功耗2uA,只有备份寄存器和待机电路供电,PLL,HSI,HSE断开,寄存器和SRAM复位,除 ...

  4. Gitlab服务不能启动postgresql

    源博文:http://www.zxmseed.com/blog/911081 1.查看启动的服务 -sh-4.1$ gitlab-ctl status warning: gitlab-workhors ...

  5. nfs挂载文件

    1. 安装必备插件  以防centos7默认没有启动nfs服务 yum -y install nfs-utils rpcbind # 启动 rpcbind 和配置开机自启动 systemctl sta ...

  6. Django model反向关联名称的方法(转)

    原文:https://www.jb51.net/article/152825.htm

  7. AetherUpload大文件传输

    AetherUpload-Laravel是laravel框架下的一个大文件传输组件 github:https://github.com/peinhu/AetherUpload-Laravel 文件传输 ...

  8. stm32 引脚映射 和 ADC

    老是弄不明白ADC的输入到底在哪,看了stm32F103Ve的datasheet,将引脚和通道的映射关系贴在下面: 好了,写到这,我已经看了中文手册一上午了,可是啥都没看懂,下午接着看,写代码不重要, ...

  9. Java8常用示例

    java.util.Map中的putIfAbsent.computeIfAbsent.computeIfPresent.compute的区别 探索Java8:(三)Predicate接口的使用 Has ...

  10. MySQL增删查改语句(入门)

    目录 create alter: insert delete update select 数据库定义语句: create:创建数据库及表对象 drop:删除数据库及表对象 alter:修改数据库及表对 ...