loj #2316
最短路 + 记忆化
记忆化搜索更容易实现
#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的更多相关文章
- [Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086
额... 首先,看到这道题,第一想法就是二分答案+线段树... 兴高采烈的认为我一定能AC,之后发现n是500000... nlog^2=80%,亲测可过... 由于答案是求满足题意的最大长度-最小长 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- Loj #2331. 「清华集训 2017」某位歌姬的故事
Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...
- 【LOJ#3097】[SNOI2019]通信(费用流)
[LOJ#3097][SNOI2019]通信(费用流) 题面 LOJ 题解 暴力就直接连\(O(n^2)\)条边. 然后分治/主席树优化连边就行了. 抄zsy代码,zsy代码是真的短 #include ...
- 【LOJ#3096】[SNOI2019]数论
[LOJ#3096][SNOI2019]数论 题面 LOJ 题解 考虑枚举一个\(A\),然后考虑有多少个合法的\(B\). 首先这个数可以写成\(a_i+kP\)的形式,那么它模\(Q\)的值成环. ...
随机推荐
- 【并发】9、借助redis 实现生产消费,消息订阅发布模式队列
这个就是一个消息可以被多次消费的范例了 其实这个实现的方式可以参考我之前的设计模式,观察者模式 https://www.cnblogs.com/cutter-point/p/5249780.html ...
- 元素的colspan和rowspan
colspan和rowspan这两个属性用于创建特殊的表格. colspan用来指定单元格横向跨越的列数:colspan就是合并列的,colspan=2就是合并两列. rowspan用来指定单元格纵向 ...
- 【转载】 腾讯云通过设置安全组禁止某些IP访问你的服务器
有时候我们在运维网站的过程中会发现一些漏洞扫描者的IP信息,或者个人爬虫网站的IP信息,此时我们想禁止掉这些IP访问到你的服务器,可以通过腾讯云的安全组功能来设置禁止这些IP访问你的服务器,也可以通过 ...
- js入门之内置对象Date
一. Date对象 Math和Date对象的区别 Math对象和Date对象的区别 Math不是一个构造函数,里面提供的是静态成员 Date是一个构造函数 首先要通过new Date() 来创建日期实 ...
- Android面试题 请解释下单线程模型中Message、Handler、MessageQueue、Looper之间的关系
简单的说,Handler获取当前线程中的looper对象,looper用来存放从MessageQueue中取出的Message,再由Handler进行Message分发和处理,按照先进先出执行. Me ...
- Linux误删python导致yum不可用,删除重装方法。
Linux 系统为 CentOS Linux release 7.4.1708 手贱.手贱.手贱 删了python 导致yum不可用.百度一大圈,重装yum和python后,老是报各种各样的错.历经磨 ...
- Linux动态连接器
转自:Chapter 9. Dynamic Linking 参考:Linux动态链接器 Linux加载启动可执行程序的过程(一)内核空间加载ELF的过程 Linux加载启动可执行程序的过程(二)解释器 ...
- 使用Ponysay,在Linux终端显示彩虹小马
Ponysay类似于Cowsay,可以在终端打印所有小马的像素画.还有个ponythink,这个是小马想,那个是小马说,效果如下: 安装: sudo apt-get install ponysay 使 ...
- 使用宏定义来判断是a和b 的大小
#include <stdio.h> #include <math.h> #define MAX(a, b) (a) > (b) ? printf("a > ...
- XAMPP启动Apache服务时启动失败
9:48:49 [Apache] Apache Service detected with wrong path 9:48:49 [Apache] Change XAMPP Apache and Co ...