题目描述

策策同学特别喜欢逛公园。 公园可以看成一张 \(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)的更多相关文章

  1. 逛公园 [NOIP2017 D1T3] [记忆化搜索]

    Description 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的 ...

  2. 洛谷P3953 逛公园 [noip2017] 图论+dp

    正解:图论(最短路)+dp(记忆化搜索) 解题报告: 这题真的是个好东西! 做了这题我才发现我的dij一直是错的...但是我以前用dij做的题居然都A了?什么玄学事件啊...我哭了TT 不过其实感觉还 ...

  3. noip2017D1T3逛公园(拓扑图上dp,记忆化搜索)

    QWQ前几天才刚刚把这个D1T3写完 看着题解理解了很久,果然我还是太菜了QAQ 题目大意就是 给你一个n个点,m条边的图,保证1能到达n,求从1到n的 (设1到n的最短路长度是d)路径长度在[d,d ...

  4. 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]表示在被选择的集合当中. 大力记忆化搜索就行了. ...

  5. 【题解】洛谷P3953 [NOIP2017TG] 逛公园(记忆化搜索+SPFA)

    题目来源:洛谷P3953 思路 先用SPFA求一遍最短路 在求最短路的同时可以把所有点到终点的最短路求出来 dis数组 注意要反向SPFA  因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加 ...

  6. NOIP2017 Day1 T3 逛公园

    NOIP2017 Day1 T3 更好的阅读体验 题目描述 策策同学特别喜欢逛公园.公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,\(N\)号点 ...

  7. 逛公园「NOIP2017」最短路+DP

    大家好我叫蒟蒻,这是我的第一篇信竞题解blog [题目描述] 策策同学特别喜欢逛公园. 公园可以看成一张 \(N\) 个点 \(M\) 条边构成的有向图,且没有自环和重边.其中 \(1\) 号点是公园 ...

  8. 【题解】NOIP2017逛公园(DP)

    [题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n​节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...

  9. NOIP2017逛公园(dp+最短路)

    策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策策每天都会 ...

随机推荐

  1. NOSQL—MongoDB之外的新选择

    MongoDB之外的新选择 MongoDB拥有灵活的文档型数据结构和方便的操作语法,在新兴的互联网应用中得到了广泛的部署,但对于其底层的存储引擎一直未对外开放,虽说开源却有失完整.Mongo版本3中开 ...

  2. SSAS Tabular关系设计--时间最小粒度维度

    这两天设计的T2模型,涉及日期维度表中粒度的选择,因为一般实际销售达成ACT表是按天为标准记录的,而销售目标表TGT一般是按月记录,特此总结一下建模技巧. 数据仓库: 时间维度表,最小粒度为DATE. ...

  3. Hadoop之WritableComprale 排序

    Hadoop之WritableComprale 排序 Hadoop只对key进行排序 排序是 MapReduce 框架中最重要的操作之一.Map Task 和 Reduce Task 均会对数据(按照 ...

  4. hdu6406 Taotao Picks Apples(线段树)

    Taotao Picks Apples 题目传送门 解题思路 建立一颗线段树,维护当前区间内的最大值maxx和可摘取的苹果数num.最大值很容易维护,主要是可摘取的苹果数怎么合并.合并左右孩子时,左孩 ...

  5. leetcode 48 矩阵旋转可以这么简单

    一行代码解决矩阵旋转(方法三). 方法1: 坐标法 def rotate(self, matrix): n = len(matrix) # 求出矩阵长度 m = (n + 1) // 2 # 求出层数 ...

  6. UPC Contest RankList – 2019年第二阶段我要变强个人训练赛第十六场

    E: 飞碟解除器 •题目描述 wjyyy在玩跑跑卡丁车的时候,获得了一个飞碟解除器,这样他就可以免受飞碟的减速干扰了.飞碟解除器每秒末都会攻击一次飞碟,但每次只有p/q的概率成功攻击飞碟.当飞碟被成功 ...

  7. [ PyQt入门教程 ] Qt Designer工具的布局管理

    这节课很重要..界面整洁美观与否就看布局了..这里讲布局方法,至于设计的天赋与最终界面的美感那就看造化了.. 本文主要讲述Qt Designer工具实现界面控件布局管理,就是排列组合控件.包括水平布局 ...

  8. 解决win10下MySQL 8.0登录Access denied for user 'root'@'localhost' (using password: YES)的问题

        近些时间在开始学MySQL,安装挺顺利的,按照网上现成的教程就能安装成功.     但是,在输入 mysql -uroot -p     再输入密码时,遇到了这个情况 Access denie ...

  9. PHP与ECMAScript_7_流程控制

      PHP ECMAScript 顺序结构 默认从上到下依次执行 默认从上到下依次执行 分支结构 if  / switch if   /  switch 循环结构 for / while / do-w ...

  10. bean的创建(五)第四部分 bean构造器的查找

    前面分析了bean的静态工厂查找 bean的构造器查找过程和bean的静态工厂查找类似 protected BeanWrapper createBeanInstance(String beanName ...