[luogu3952 noip2017] 逛公园 (计数dp+最短路)
Description

Input

Output
输出文件包含 T 行,每行一个整数代表答案。
Sample Input
2
5 7 2 10
1 2 1
2 4 0
4 5 2
2 3 2
3 4 1
3 5 2
1 5 3
2 2 0 10
1 2 0
2 1 0
Sample Output
3
-1
HINT
【样例解释1】
对于第一组数据,最短路为 3 。 \(1 – 5\), \(1 – 2 – 4 – 5\),\(1 – 2 – 3 – 5\) 为 3 条合法路径。
【测试数据与约定】
对于不同的测试点,我们约定各种参数的规模不会超过如下

Solution
设dis[i]为i到n最短路
设dp[i][j]表示dis<=dis[i]+j的i到n的方案数
转移时把所有符合条件的都转移过来,如果发现某个dp同时出现说明有0环直接输出-1
用记搜很好实现
Code
最终还是最短路写错了(T▽T)
//By Menteur_Hxy
#include <queue>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M(a,b) memset(a,(b),sizeof(a))
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define _E(i,u) for(register int i=_head[u];i;i=_nxt[i])
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
typedef pair<int,int> PII;
int read() {
int x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
}
const int N=100010,M=200010;
int n,m,K,MOD,cnt,_cnt;
int dis[N],nxt[M],_nxt[M],to[M],_to[M],w[M],_w[M],head[N],_head[N],vis[N],dp[N][60],in[N][60];
vector <int> V[N];
void dij() {
priority_queue<PII,vector<PII>,greater<PII> > Q;
Q.push(PII(dis[n]=0,n));
while(!Q.empty()) {
int u=Q.top().second,v; Q.pop();
if(vis[u]) continue; vis[u]=1;
E(i,u) if(dis[v=to[i]]>dis[u]+w[i]) {
dis[v]=dis[u]+w[i];
Q.push(PII(dis[v],v));
}
}
}
int dfs(int u,int k) {
if(in[u][k]) return -1;
if(dp[u][k]) return dp[u][k];
in[u][k]=1; dp[u][k]=(u==n);
int tmp,v,reg;
_E(i,u) if((tmp=dis[v=_to[i]]+_w[i]-dis[u])<=k) {
if((reg=dfs(v,k-tmp))==-1) return dp[u][k]=-1;
dp[u][k]=(dp[u][k]+reg)%MOD;
}
return in[u][k]=0,dp[u][k];
}
#define _add(a,b,c) _nxt[++_cnt]=_head[a],_to[_cnt]=b,_w[cnt]=c,_head[a]=_cnt
#define add(a,b,c) nxt[++cnt]=head[a],to[cnt]=b,w[cnt]=c,head[a]=cnt
int main() {
int T=read();
while(T--) {
_cnt=cnt=0;M(dis,0x3f);M(head,0);M(vis,0);M(dp,0),M(in,0),M(_head,0);
n=read(),m=read(),K=read(),MOD=read();
F(i,1,n) V[i].clear();
F(i,1,m) {
int a=read(),b=read(),c=read();
add(b,a,c); _add(a,b,c);
}
dij();
printf("%d\n",dfs(1,K));
}
return 0;
}
[luogu3952 noip2017] 逛公园 (计数dp+最短路)的更多相关文章
- NOIP2017逛公园(dp+最短路)
策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策策每天都会 ...
- LOJ P3953 逛公园 NOIP dp 最短路 拓扑排序
https://www.luogu.org/problemnew/show/P3953 开o2过了不开o2re一个点...写法如题 顺便一提这道题在我校oj是a不了的因为我校土豆服务器速度奇慢1s时限 ...
- [NOIP2017]逛公园(DP)
先spfa一遍处理出d[]数组,(从n开始bfs一遍标记可以达到n的点) 题意即,在走最短路的基础上,可以最多多走K长度的路径, 考虑DP,每次剩余可走的长度会因决策而改变,所以考虑dp[i][j]为 ...
- 【题解】NOIP2017逛公园(DP)
[题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...
- [NOIP2017] 逛公园
[NOIP2017] 逛公园 题目大意: 给定一张图,询问长度 不超过1到n的最短路长度加k 的1到n的路径 有多少条. 数据范围: 点数\(n \le 10^5\) ,边数\(m \le 2*10^ ...
- 【比赛】NOIP2017 逛公园
考试的时候灵光一闪,瞬间推出DP方程,但是不知道怎么判-1,然后?然后就炸了. 后来发现,我只要把拓扑和DP分开,中间加一个判断,就AC了,可惜. 看这道题,我们首先来想有哪些情况是-1:只要有零环在 ...
- NOIP2017 逛公园 题解报告 【最短路 + 拓扑序 + dp】
题目描述 策策同学特别喜欢逛公园.公园可以看成一张NNN个点MMM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,NNN号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花 ...
- 【洛谷】3953:逛公园【反向最短路】【记忆化搜索(DP)统计方案】
P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...
- 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索
题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...
随机推荐
- @RequiresPermissions 注解说明
@RequiresAuthentication验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时.@RequiresUser验证用户是否被记忆,user有 ...
- Linux命令(七)——网络配置和网络通信
在使用网络前,需要对linux主机进行基本的网络配置,配置后可以使该主机能够同其他主机进行正常的通信. 一.网络配置 1.ifcfg-ethn网络配置文件 所有的网络接口配置文件均存放在/etc/sy ...
- 找新朋友(hdoj--1286--欧拉函数)
欢迎参加--每周六晚的BestCoder(有米!) 找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- 南海区行政审批管理系统接口规范v0.3(规划)4.2.【queryExpireList】当天到期业务查询
加密前:{"time":"1510053168455","username":"GH_DATA_EXCHANGE",&q ...
- Juniper交换机维护
Juniper交换机维护操作之一: 1.1 交换机启动和关闭 1.1.1 重新启动 1. 使用具有足够权限的用户名和密码登陆CLI命令行界面. 2. 在提示符下输入下面的命令: use ...
- .NET使用Office Open XML导出大量数据到 Excel
我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...
- C#中DBNull问题
当数据库中一个字段不是必填项时,在往数据库中插入数据的时候往往会插入一个空字符串就草草了事了.在这里用DBNull可以解决这个问题 /// <summary> /// 插入数据 /// & ...
- javascript中构造函数的三种方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python 之 基础知识(二)
一.分支运算 在Python 2.x中判断不等于还可以用<> if语句进阶:elif if 条件1: ...... elif 条件2: ...... else: ...... 二.逻辑运算 ...
- ASP.NET 微信公众平台模板消息推送功能完整开发
最近公众平台的用户提出了新需求,他们希望当收到新的邮件或者日程的时候,公众平台能主动推送一条提醒给用户.看了看平台提供的接口,似乎只有[模板消息]能尽量满足这一需求,但不得不说微信提供的实例太少,而且 ...