题目:https://www.luogu.org/problemnew/show/P3953

主要是看题解...还是觉得好难想啊...

dfs DP,剩余容量的损耗是边权减去两点最短路差值...表示对于最短路来说多走了这么多...

还要注意该点能否到达 n 号点,不能就不走了(剪枝);

%p 那个地方会爆 int 吗?反正 %=p RE了一个点...(然而改成 ll 还是RE)

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
int const maxn=2e5+,maxm=4e5+,inf=0x3f3f3f3f;
int T,n,m,K,p,hd[maxn],ct,head[maxn],xt;
int f[maxn][],dis[maxn],s[maxn][];
bool v[maxn][],in[maxn],vis[maxn];
queue<int>q;
queue<int>ff;
struct N{
int to,nxt,w;
N(int t=,int n=,int w=):to(t),nxt(n),w(w) {}
}ed[maxm],edge[maxm];
void add(int x,int y,int z){ed[++ct]=N(y,hd[x],z); hd[x]=ct;}
void add2(int x,int y,int z){edge[++xt]=N(y,head[x],z); head[x]=xt;}
void spfa()
{
while(q.size())q.pop();
memset(vis,,sizeof vis);
memset(dis,0x3f,sizeof dis);
dis[]=; vis[]=; q.push();
while(q.size())
{
int x=q.front(); q.pop(); vis[x]=;
for(int i=hd[x],u;i;i=ed[i].nxt)
if(dis[u=ed[i].to]>dis[x]+ed[i].w)
{
dis[u]=dis[x]+ed[i].w;
if(!vis[u])vis[u]=,q.push(u);
}
}
}
void bfs()
{
while(q.size())q.pop();
in[n]=; q.push(n);
while(q.size())
{
int x=q.front(); q.pop();
for(int i=head[x],u;i;i=edge[i].nxt)
{
if(in[u=edge[i].to])continue;
in[u]=; q.push(u);
}
}
}
int dfs(int x,int w)
{
if(w<)return ;
else if(v[x][w])return -inf;
else if(s[x][w]!=-)return s[x][w];
else
{
int ret=; v[x][w]=;
if(x==n)ret++;//
for(int i=hd[x],u;i;i=ed[i].nxt)
{
if(!in[u=ed[i].to])continue;//!
int tmp=dfs(u,w-(ed[i].w-(dis[u]-dis[x])));
if(tmp==-inf)return -inf;
else ret=(ret+tmp)%p;//(ret+=tmp)%=p RE?
}
v[x][w]=;
s[x][w]=ret%p;
return ret;
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&n,&m,&K,&p);
ct=; xt=;
memset(hd,,sizeof hd);
memset(head,,sizeof head);
for(int i=,x,y,z;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add2(y,x,z);
}
memset(in,,sizeof in);
spfa(); bfs();
memset(v,,sizeof v);
memset(s,-,sizeof s);
int ans=dfs(,K);
if(ans==-inf)printf("-1\n");
else printf("%d\n",ans);
}
return ;
}

洛谷 P3953 [ NOIP 2017 ] 逛公园 —— 最短路DP的更多相关文章

  1. 洛谷 P3951 NOIP 2017 小凯的疑惑

    洛谷 P3951 NOIP 2017 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付 ...

  2. [NOIp 2017]逛公园

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

  3. 【洛谷】3953:逛公园【反向最短路】【记忆化搜索(DP)统计方案】

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

  4. NOIP 2017 逛公园 记忆化搜索 最短路 好题

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

  5. 洛谷 P3960 [ NOIP 2017 ] 列队 —— 线段树

    题目:https://www.luogu.org/problemnew/show/P3960 NOIP 题,不用很复杂的数据结构...但又参考了许多: 要求支持维护删除第 k 个和在末尾插入的数据结构 ...

  6. NOIP 2017 逛公园 - 动态规划 - 最短路

    题目传送门 传送门 题目大意 给定一个$n$个点$m$条边的带权有向图,问从$1$到$n$的距离不超过最短路长度$K$的路径数. 跑一遍最短路. 一个点拆$K + 1$个点,变成一个DAG上路径计数问 ...

  7. 【洛谷P4513】小白逛公园

    题目大意:维护动态带修改最大子段和. 题解:线段树额外维护合并最优解时需要的信息. 代码如下 #include <bits/stdc++.h> using namespace std; c ...

  8. 洛谷 P2822 [ NOIP 2017 ] 组合数问题 —— 数学

    题目:https://www.luogu.org/problemnew/show/P2822 阶乘太大,算不了: 但 k 只有 8 个质因子嘛,暴力60分: #include<iostream& ...

  9. NOIP 2017 逛公园 题解

    题面 这道题是一道不错的计数类DP: 首先我们一定要跑一遍dijkstra来求得每个点到1号点的最短路: 注意题干,题中并没有说所有点都可以到达n好点,只说了存在一条1号点到n号点的路径:所以我们在反 ...

随机推荐

  1. jQuery制作顶部与左侧锚点板块定位功能带动画跳转特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. UICollectionView(一)基本概念

    整体预览 高等级的包含和管理(Top-level containment and management) UICollectionView UICollectionViewController UIC ...

  3. CSS (层叠样式表)

    层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS不仅可以静态 ...

  4. Java中“==”、“compareTo()”和“equals()”的区别

    在比较两个对象或者数据大小的时候,经常会用到==.compareTo()和equals(),尤其是在接入了Comparable接口后重写compareTo方法等场景,所以我们来理一下这三个的区别. 1 ...

  5. php第十八节课

    PDO 对不同的数据库连接使用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...

  6. UVALive 3026(KMP算法)

    UVALive 3026     KMP中next[]数组的应用: 题意:给出一个字符串,问该字符串每个前缀首字母的位置和该前缀的周期. 思路:裸KMP直接上就是了: 设该字符串为str,str字符串 ...

  7. isset在php5.6-和php7.0+的一些差异

    今天在公司实现一个模块功能时写了如下代码: class ProductCategory { const TYPES = [ 1 => 'type1', 2 => 'type2', ]; p ...

  8. 5.2.2 re模块方法与正则表达式对象

    Python标准库re提供了正则表达式操作所需要的功能,既可以直接使用re模块中的方法,来实现,也可以把模式编译成正则表达式对象再使用. 方法 功能说明 complie(pattern[,flagss ...

  9. 【郑轻邀请赛 H】 维克兹的进制转换

    [题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2134 [题意] [题解] 设f[i]表示数字i分解为二进制数的方案数; 则 如果i为 ...

  10. 【codeforces 527D】Clique Problem

    [题目链接]:http://codeforces.com/contest/527/problem/D [题意] 一维线段上有n个点 每个点有坐标和权值两个域分别为xi,wi; 任意一对点(i,j) 如 ...