逛公园[NOIP2017 D2 T3](dp+spfa)
题目描述
策策同学特别喜欢逛公园。 公园可以看成一张 \(N\)个点\(M\) 条边构成的有向图,且没有自环和重边。其中 1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的时间。
策策喜欢新鲜的事物,他不希望有两天逛公园的路线完全一样,同时策策还是一个特别热爱学习的好孩子,他不希望每天在逛公园这件事上花费太多的时间。如果1号点到N号点的最短路长为\(d\),那么策策只会喜欢长度不超过d+K的路线。
策策同学想知道总共有多少条满足条件的路线,你能帮帮他吗?
为避免输出过大,答案对 P取模。
如果有无穷多条合法的路线,请输出 −1。
[输入格式]
第一行包含一个整数 T, 代表数据组数。
接下来 T 组数据,对于每组数据:
第一行包含四个整数 N,M,K,P, 每两个整数之间用一个空格隔开。
接下来 M行,每行三个整数 u,v,w,代表编号为 u,v的点之间有一条权值为w的有向边,每两个整数之间用一个空格隔开。
[输出格式]
输出文件包含 T 行,每行一个整数代表答案。
对于 100% 的数据:1<=T<=5,1<=N<=100000,1≤P≤1000000000,1≤u,v≤N,0<=w<=1000,1<=K<=50,
数据保证:至少存在一条合法的路线.
往下\(\bigvee\)
欢迎来到
星光大道!
不管是
彩蛋
巨佬blog链接
信息人生格言
词语释义
都有!
都有!
都有!
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
继续
我最菜了
WQT最巨了
orz orz orz
sto sto sto
W
q
t
AK
IOI!
快到了
Codefoces
毁我人生!
40M
里根=李俊泽小根根
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
30M
愚昧=余星辰小妹妹
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
20M
引自JL LK
原曲:野百合也有春天
填词:蒟蒻LK
不管什么有环没环♫正环负环♫SPFA都能判
Dijkstra做的到吗♫做不做得到♫分数往下掉
各种问题单源最短♫差分约束♫玄学复杂度
在那信息技术♫图论的算法里♫SPFA也有春天
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
10M
JL1 blog
JL2 blog
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
\(\bigvee\)
XIBER!!!

作为NOIP 的压轴题,刚看到题就知道怎么DP的我写了30分钟愣是写不出来.
是个和Orange♂Good或者其他老师学过性竞信竞的正常人一看数据就知道这题肯定是DP,枚举K(不然人家干嘛给你那么小的K),dp[i][j]=从1到i,比最短路多走j的路径条数,显然
dp[i][j]=∑dp[x]dis[i]−dis[x]+j−edge(i,x),
其中x->i有路
于是乎再加个SPFA判负环这道简单的题就出来啦!!!
代码极其简单:
#include <iostream>
#include <queue>
#include <cstring>
#include <cmath>
#include <algorithm>
//反正都include了总没错
//NOIP时最好别用BITS,否则爆0都没人诉苦
using namespace std;
#define int long long//一时define一时爽,一直define一直爽
#define MAX1 200001
#define MAX2 800001
int loca[MAX1],nxt[MAX2],to[MAX2],len[MAX2],top1;
int Loca[MAX1],Nxt[MAX2],To[MAX2],Len[MAX2],top2;
int dis[MAX1],dis2[MAX2],vis2[MAX1][55];
int dp[MAX1][55],vis[MAX1],zihuan,u,v,w,t,n,m,k,p,ans;
void push1(int u,int v,int w) {
nxt[++top1]=loca[u];loca[u]=top1;to[top1]=v;len[top1]=w;//正常边
}
void push2(int u,int v,int w) {
Nxt[++top2]=Loca[u];Loca[u]=top2;To[top2]=v;Len[top2]=w;//反向边,dp用
}
void SPFA() {//顺便问下,SPFA的中文名字是什么???
vis[1]=1;
dis[1]=0;
queue<int> q;
q.push(1);
while (!q.empty()) {
int x=q.front();
q.pop();
for (int i=loca[x];i;i=nxt[i]) {
int y=to[i];
if (dis[y] > dis[x] + len[i]) {
dis[y] = dis[x] + len[i];
if (!vis[y]) {
vis[y] = 1;
q.push(y);
}
}
}
vis[x] = 0;
}
}
int dfs(int c, int now) {
if(dp[c][now]!=-1) return dp[c][now];
vis2[c][now] = 1;
dp[c][now] = 0;
for (int i=Loca[c];i;i = Nxt[i]) {
int xibo=dis[c]-dis[To[i]]+now-Len[i];//zzy不知道会不会打我QWQ
if (xibo<0) continue;
if (vis2[To[i]][xibo]) {
zihuan = 1;
return 0;
}
dp[c][now]+=dfs(To[i],xibo);
dp[c][now]%=p;
}
vis2[c][now] = 0;
return dp[c][now];
}
void init(){
memset(loca,0,sizeof(loca));
memset(Loca,0,sizeof(Loca));
memset(dp,-1,sizeof(dp));
memset(vis2,0,sizeof(vis2));
memset(vis,0,sizeof(vis));
memset(dis,0x7f,sizeof(dis));
zihuan=ans=top1=top2=0;
}
#undef int
int main() {
#define int long long
cin>>t;
for(int j=1;j<=t;j++){
init();
cin>>n>>m>>k>>p;
for(int i=1;i<=m;i++) cin>>u>>v>>w,push1(u,v,w),push2(v,u,w);
SPFA();
dp[1][0]=1;
for(int i=0;i<=k;i++)ans+=dfs(n,i),ans%=p;
dfs(n,k+1);
if(zihuan)cout<<-1<<endl;
else cout<<ans<<endl;
}
}
逛公园[NOIP2017 D2 T3](dp+spfa)的更多相关文章
- 逛公园 [NOIP2017 D1T3] [记忆化搜索]
Description 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的 ...
- 洛谷P3953 逛公园 [noip2017] 图论+dp
正解:图论(最短路)+dp(记忆化搜索) 解题报告: 这题真的是个好东西! 做了这题我才发现我的dij一直是错的...但是我以前用dij做的题居然都A了?什么玄学事件啊...我哭了TT 不过其实感觉还 ...
- noip2017D1T3逛公园(拓扑图上dp,记忆化搜索)
QWQ前几天才刚刚把这个D1T3写完 看着题解理解了很久,果然我还是太菜了QAQ 题目大意就是 给你一个n个点,m条边的图,保证1能到达n,求从1到n的 (设1到n的最短路长度是d)路径长度在[d,d ...
- 2018.11.01 洛谷P3953 逛公园(最短路+dp)
传送门 设f[i][j]f[i][j]f[i][j]表示跟最短路差值为iii当前在点jjj的方案数. in[i][j]in[i][j]in[i][j]表示在被选择的集合当中. 大力记忆化搜索就行了. ...
- 【题解】洛谷P3953 [NOIP2017TG] 逛公园(记忆化搜索+SPFA)
题目来源:洛谷P3953 思路 先用SPFA求一遍最短路 在求最短路的同时可以把所有点到终点的最短路求出来 dis数组 注意要反向SPFA 因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加 ...
- NOIP2017 Day1 T3 逛公园
NOIP2017 Day1 T3 更好的阅读体验 题目描述 策策同学特别喜欢逛公园.公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,\(N\)号点 ...
- 逛公园「NOIP2017」最短路+DP
大家好我叫蒟蒻,这是我的第一篇信竞题解blog [题目描述] 策策同学特别喜欢逛公园. 公园可以看成一张 \(N\) 个点 \(M\) 条边构成的有向图,且没有自环和重边.其中 \(1\) 号点是公园 ...
- 【题解】NOIP2017逛公园(DP)
[题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...
- NOIP2017逛公园(dp+最短路)
策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策策每天都会 ...
随机推荐
- WPF 入门笔记之基础
一.创建WPF程序 1. App.xaml 相当于窗体的配置文件 2. xmlns:xml名称空间的缩写 xmlns="http://schemas.microsoft.com/winfx/ ...
- BASE64Encoder及BASE64Decoder的正确用法
一直以来Base64的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder的sun.misc.BASE64Encoder/BASE64Decoder类.这人个类 ...
- java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)
简介 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程.其实这些基本上在python接口自动化的文章中已经详细的介绍过了,不清楚的可以过去看看.了 ...
- Socket编程:listen()函数英文翻译
作者:C语言达人 链接:https://zhuanlan.zhihu.com/p/24951131 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本篇翻译的list ...
- STM32F072从零配置工程-自定义时钟配置详解
从自己的板子STM32F407入手,参考官方的SystemInit()函数: 核心在SetSysClock()这个函数,官方默认是采用HSE(设定为8MHz)作为PLL锁相环的输入输出168MHz的S ...
- Ansible配置文件ansible.cfg详解
Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. Ansible系列博文直达链接:Ansible入门系列 前言 此时外面小雨淅淅沥沥 ...
- [剑指offer] 6. 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...
- linux初学者-用户管理篇
linux的用户管理是非常以后工作中重要的一部分,也是linux系统安全的防线. 1.用户理解 那么到底什么是用户呢?用户就是系统使用者的身份. 用户是以怎样的方式储存在计算机中的呢?在系统中用户存储 ...
- python requests、xpath爬虫增加博客访问量
这是一个分析IP代理网站,通过代理网站提供的ip去访问CSDN博客,达到以不同ip访同一博客的目的,以娱乐为主,大家可以去玩一下. 首先,准备工作,设置User-Agent: #1.headers h ...
- pheatmap绘制“热图”,你需要的都在这
热图可以聚合大量的数据,并可以用一种渐进色来优雅地表现,可以很直观地展现数据的疏密程度或频率高低. 本文利用R语言 pheatmap 包从头开始绘制各种漂亮的热图.参数像积木,拼凑出你最喜欢的热图即可 ...