先spfa一遍处理出d[]数组,(从n开始bfs一遍标记可以达到n的点)

题意即,在走最短路的基础上,可以最多多走K长度的路径,

考虑DP,每次剩余可走的长度会因决策而改变,所以考虑dp[i][j]为当前在i号节点,剩余可多走长度为j的方案数

dp[u][j]可以从dp[v][e[i].w-(d[v]-d[u])]转移而来,(其中u->v,e[i].w-(d[v]-d[u])即为当前决策多走的路径))

再考虑有0边的情况,如果构成环就会无限方案数,只要在记忆化的时候特判一下-1即可

ps:对于一个dp[u][j]可能为0,初始化不能为0

Code

#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#define N 100010
using namespace std; struct info{int to,nex,w;}e[N*2],re[N*2];
int T,n,m,k,mo,tot,head[N],d[N],rtot,rhead[N],dp[N][56];
bool ab[N];
bool vis[N][56]; inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} void Init(){
memset(vis,0,sizeof(vis));
memset(head,0,sizeof(head));
memset(rhead,0,sizeof(rhead));
memset(ab,0,sizeof(ab));
memset(dp,-1,sizeof(dp));
tot=rtot=0;
} inline void Link(int u,int v,int w){
e[++tot].to=v,e[tot].w=w;e[tot].nex=head[u];head[u]=tot;
} inline void rLink(int u,int v,int w){
re[++rtot].to=v,re[rtot].w=w;re[rtot].nex=rhead[u];rhead[u]=rtot;
} namespace SPFA{
queue<int> q;
bool vis[N];
void spfa(){
for(;!q.empty();q.pop());
memset(vis,0,sizeof(vis));
memset(d,127,sizeof(d));
d[1]=0,q.push(1);
for(;!q.empty();){
int u=q.front();vis[u]=0,q.pop();
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(d[v]>d[u]+e[i].w){
d[v]=d[u]+e[i].w;
if(!vis[v]) vis[v]=1,q.push(v);
}
}
}
memset(vis,0,sizeof(vis));
}
void afps(){
for(;!q.empty();q.pop());
q.push(n),ab[n]=1;
for(;!q.empty();){
int u=q.front();q.pop();
for(int i=rhead[u];i;i=re[i].nex){
int v=re[i].to;
if(ab[v]) continue;
ab[v]=1,q.push(v);
}
}
}
void work(){spfa(),afps();}
} int DP(int u,int k){
if(k<0)return 0;
int &tmp=dp[u][k];
if(vis[u][k]) return -2;
if(tmp!=-1) return tmp;
vis[u][k]=1;
tmp=(u==n)?1:0;
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(!ab[v]) continue;
int x=DP(v,k-(e[i].w-(d[v]-d[u])));
if(x==-2) return -2;
else (tmp+=x)%=mo;
}
vis[u][k]=0;
return tmp;
} int main(){
for(T=read();T--;){
Init();
n=read(),m=read(),k=read(),mo=read();
for(;m--;){
int u=read(),v=read(),w=read();
Link(u,v,w),rLink(v,u,w);
}
SPFA::work();
int Ans=DP(1,k);
if(Ans==-2)puts("-1");
else printf("%d\n",Ans);
}
return 0;
}

[NOIP2017]逛公园(DP)的更多相关文章

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

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

  2. $[NOIp2017]$ 逛公园 $dp$/记搜

    \(Des\) 给定一个有向图,起点为\(1\),终点为\(n\),求和最短路相差不超过\(k\)的路径数量.有\(0\)边.如果有无数条,则输出\(-1\). \(n\leq 10^5,k\leq ...

  3. [NOIP2017] 逛公园

    [NOIP2017] 逛公园 题目大意: 给定一张图,询问长度 不超过1到n的最短路长度加k 的1到n的路径 有多少条. 数据范围: 点数\(n \le 10^5\) ,边数\(m \le 2*10^ ...

  4. 【比赛】NOIP2017 逛公园

    考试的时候灵光一闪,瞬间推出DP方程,但是不知道怎么判-1,然后?然后就炸了. 后来发现,我只要把拓扑和DP分开,中间加一个判断,就AC了,可惜. 看这道题,我们首先来想有哪些情况是-1:只要有零环在 ...

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

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

  6. NOIP2017 逛公园 题解报告 【最短路 + 拓扑序 + dp】

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

  7. P3953 逛公园(dp,最短路)

    P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张NN个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,NN号点是公园的出口,每条边有一个非负权值, 代表策策经 ...

  8. [NOIP2017]逛公园 题解

    我连D1T3都不会我联赛完蛋了 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 N 个点 M 条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口, N 号点是公园的出口,每条边有一个非负 ...

  9. [NOIP2017] 逛公园 解题报告(DP)

    我很不想说 在我的AC代码上我打了表,但实在没有办法了.莫名的8,9个点RE.然而即便是打表...也花了我很久. 这大概是NOIP2017最难的题了,为了让不懂的人更容易理解,这篇题解会比较详细 我的 ...

  10. [NOIP2017]逛公园 最短路+拓扑排序+dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...

随机推荐

  1. 设计模式:外观(Facade)模式

    设计模式:外观(Facade)模式 一.前言   外观模式是一种非常简单的模式,简单到我们经常都会使用,比如对于类A和B,如果两者需要交互,经过一定的处理过程才能实现某一个具体的功能,那么我们可以将这 ...

  2. 阅读HandlerInterceptor接口源码的理解

    一.阅读接口类注释 我先理解的方法,方法都看懂了类注释自然而然明白了.所以此处略. 二.阅读preHandle()方法注释 Intercept the execution of a handler. ...

  3. dba_tables、all_tables、user_tables

    本文摘抄自:http://blog.csdn.net/daxiang12092205/article/details/42921063 dba_tables : 系统里所有的表的信息,需要DBA权限才 ...

  4. BZOJ2160:拉拉队排练(Manacher)

    Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训 ...

  5. BZOJ1009:[HNOI2008]GT考试(AC自动机,矩乘DP)

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...

  6. 【转】Android学习系列(39)--Android主题和样式之系统篇(上)

    [基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计 ...

  7. springAOP(Aspect)权限访问页面

    1.XML进行配置切面 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...

  8. java中数据类型的范围

    前言:最近:本菜鸡在准备pat,可以每次遇到数据类型的时候都得去查找范围,因此本着学习的目的,来总结一下java中的数据类型. 因此我用mindManager做了一个思维图

  9. 使用ITextSharper小结

    用到了生成PDF版的合同,上网研究了一圈,发现不需要服务器端安装插件的,比较好用的就是这个ITextSharper了,于是便开始了研究. 1.解决汉字不显示的问题,指定一下字体,默认的字体好像不支持中 ...

  10. win7系统安装VS2013后,连不上远程sqlserver数据库解决办法

    刚搬了地方,顺便把电脑重做了系统,把sql2012和vs2013装好,怎么弄也连不上远程的数据库了,用程序连IIS直接死掉,用ssms连也是直接失去响应,开始以为是网线端口被运营商封杀了,最后发现不是 ...