[luogu P3953] [noip2017 d1t3] 逛公园
[luogu P3953] [noip2017 d1t3] 逛公园
题目描述
策策同学特别喜欢逛公园。公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边。其中1号点是公园的入口,$N$号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间。
策策每天都会去逛公园,他总是从1号点进去,从$N$号点出来。
策策喜欢新鲜的事物,它不希望有两天逛公园的路线完全一样,同时策策还是一个 特别热爱学习的好孩子,它不希望每天在逛公园这件事上花费太多的时间。如果1号点 到$N$号点的最短路长为$d$,那么策策只会喜欢长度不超过$d + K$的路线。
策策同学想知道总共有多少条满足条件的路线,你能帮帮它吗?
为避免输出过大,答案对$P$取模。
如果有无穷多条合法的路线,请输出−1。
输入输出格式
输入格式:
第一行包含一个整数 $T$, 代表数据组数。
接下来$T$组数据,对于每组数据: 第一行包含四个整数 $N,M,K,P$,每两个整数之间用一个空格隔开。
接下来$M$行,每行三个整数$a_i,b_i,c_i$,代表编号为$a_i,b_i$的点之间有一条权值为 $c_i$的有向边,每两个整数之间用一个空格隔开。
输出格式:
输出文件包含 $T$ 行,每行一个整数代表答案。
输入输出样例
说明
【样例解释1】
对于第一组数据,最短路为 3。 1 – 5, 1 – 2 – 4 – 5, 1 – 2 – 3 – 5 为 3 条合法路径。
【测试数据与约定】
对于不同的测试点,我们约定各种参数的规模不会超过如下
测试点编号 $T$ $N$ $M$ $K$ 是否有0边 1 5 5 10 0 否 2 5 1000 2000 0 否 3 5 1000 2000 50 否 4 5 1000 2000 50 否 5 5 1000 2000 50 否 6 5 1000 2000 50 是 7 5 100000 200000 0 否 8 3 100000 200000 50 否 9 3 100000 200000 50 是 10 3 100000 200000 50 是 对于 100%的数据, $1 \le P \le 10^9,1 \le a_i,b_i \le N ,0 \le c_i \le 1000$。
数据保证:至少存在一条合法的路线。
哎,可惜了,因为一个玄学错误,而失去了a掉这题机会。
真的,我沿着完全正确的方向思考——dp,f[t][i],到i点,路径长与到i的最短路相差t的方案数。
if (t-(w-d)>=0) f[t][son[j]]+=f[t-(w-d)][i]。其中w是边权,d是dis[son[j]]-dis[i]。
当然,在考试中,我发现在d=w时会有些小差异,。要确定顺序、好啊,来个topo啊,直接抓来一棵想类似最短路树的东西,直接可以进行topo。
然后-1的判法,考场上只写了spfa直接判,没多想,其实可以根据topo排序的结果,是否合法判断一下就可以了。
但是还是wa了,为什么?
今天正好订正这题,改了一个地方:
if (t+(w-d)<=k) f[t+(w-d)][son[j]]+=f[t][i],就a掉了,否则wa30。
qwq。。。自己玩死自己。
但为什么这样就可以了呢?
我还没有想清楚啊,不知道有没有大佬能给个好的解释?
code:
- %:pragma GCC optimize()
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #define LL long long
- #define ms(a,x) memset(a,x,sizeof a)
- using namespace std;
- ,M=;
- int n,m,k,p,tot,lnk[N],nxt[M],son[M],w[M];
- int tt,lk[N],nt[M],sn[M];
- ],f[N],l,r; bool vis[N];
- ][N],d,ans;
- inline int readint() {
- ; char ch=getchar();
- ') ch=getchar();
- +ch-',ch=getchar();
- return x;
- }
- void adde(int x,int y,int z) {
- nxt[++tot]=lnk[x],lnk[x]=tot,son[tot]=y,w[tot]=z;
- }
- void addn(int x,int y) {
- nt[++tt]=lk[x],lk[x]=tt,sn[tt]=y;
- }
- void spfa() {
- ms(dis,),ms(vis,);
- dis[]=,q[]=,l=,r=;
- for (int x; l!=r; ) {
- l=(l+)%N,vis[x=q[l]]=;
- for (int j=lnk[x]; j; j=nxt[j]) {
- if (dis[son[j]]>dis[x]+w[j]) {
- dis[son[j]]=dis[x]+w[j];
- )%N,vis[q[r]=son[j]]=;
- }
- }
- }
- }
- void topo() {
- ms(vis,);
- l=,r=;
- ; i<=n; ++i) ) q[++r]=i;
- for (int x; l<r; ) {
- ++l,x=q[l];
- ) {
- --f[sn[j]];
- ) q[++r]=sn[j];
- }
- }
- }
- int main() {
- for (int T=readint(); T; --T) {
- tot=,ms(lnk,),ms(nxt,);
- tt=,ms(lk,),ms(nt,);
- n=readint(),m=readint(),k=readint(),p=readint();
- ,x,y,z; i<=m; ++i) {
- x=readint(),y=readint(),z=readint();
- adde(x,y,z);
- }
- spfa();
- ms(g,),g[][]=,ms(f,);
- ; i<=n; ++i)
- for (int j=lnk[i]; j; j=nxt[j])
- if (dis[son[j]]==dis[i]+w[j]) ++f[son[j]],addn(i,son[j]);
- topo();
- if (r<n) {
- puts("-1");
- continue;
- }
- ; t<=k; ++t)
- ,i; x<=n; ++x) {
- i=q[x];
- for (int j=lnk[i]; j; j=nxt[j]) {
- d=dis[son[j]]-dis[i];
- if (t+w[j]-d<=k) {
- g[t+w[j]-d][son[j]]+=g[t][i];
- if (g[t+w[j]-d][son[j]]>=p) g[t+w[j]-d][son[j]]-=p;
- }
- }
- }
- ans=;
- ; t<=k; ++t) ans=(ans+g[t][n])%p;
- printf("%d\n",ans);
- }
- ;
- }
[luogu P3953] [noip2017 d1t3] 逛公园的更多相关文章
- NOIP2017 D1T3逛公园
DP+最短路 两遍最短路判零环 DP转移f[i][j] 到点i的距离比最短路多j时的方案数 #include<bits/stdc++.h> using namespace std; ; s ...
- NOIP2017 D1T3 逛公园
发现 \(K\) 很小,不妨设置一个 \(O(NK)\) 的 \(DP\). 发现可行的最短路必须满足是 \(d <= dis <= d + K\). 由逆向思维,则是从某点出发,可以消耗 ...
- 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索
题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...
- 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)
题意: 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花 ...
- Luogu P3953 [NOIP2017]逛公园
题目 首先我们跑出从\(1\)出发的最短路\(d1\)和反图上从\(n\)出发的最短路\(dn\). 然后我们处理出长度不超过\(d1_n+k\)的最短路边集,给它拓扑排序. 如果存在环,那么这个环一 ...
- 洛谷 P3953 [ NOIP 2017 ] 逛公园 —— 最短路DP
题目:https://www.luogu.org/problemnew/show/P3953 主要是看题解...还是觉得好难想啊... dfs DP,剩余容量的损耗是边权减去两点最短路差值...表示对 ...
- NOIP2017:逛公园
Sol 发现\(NOIP2017\)还没\(AK\)??? 赶紧改 考场上明明打出了\(DP\),没时间了,没判环,重点是没初始化数组,爆\(0\) \(TAT\) 先最短路,然后\(f[i][j]\ ...
- 「NOIP2017」逛公园
传送门 Luogu 解题思路 考虑 \(\text{DP}\). 设 \(f[u][k]\) 表示从 \(u\) 到 \(n\) 走过不超过 \(Mindis(u, n) + k\) 距离的方案数. ...
- 【NOIP2017】逛公园 最短路+DP
诶,去年场上不会处理$0$的环,只拿了$60$有点可惜. 我们先不管边边权为$0$的边. 我们先跑一次最短路,令$dis[u]$表示从$1$至$u$的最短路的长度. 那么根据题目的要求,从起点走到$u ...
随机推荐
- vm中的nat模式不能连接到主机,以及不能上网
主机能够ping通vm中的ip,但是vm不能ping通主机ip vm不能ping通主机:主要是虚拟机中的gateway的设置和vm的网络编辑器中的网关id不一致造成的 vm不能上外网:dns没有配置正 ...
- java 接口详解
定义接口 接口继承和实现继承的规则不同,一个类只有一个直接父类,但可以实现多个接口.Java 接口本身没有任何实现,只描述 public 行为,因此 Java 接口比 Java 抽象类更抽象化.Jav ...
- 【js】js声明与数据类型
之前整理知识点感觉有点没有针对性,每期知识点之间都没有关联,不成体系,其实对学习与运用知识并无益,随着知识的积累,不使用就会忘记.所以从本次开始,将对知识点进行体系化.先列出本期知识体系图,再进行逐步 ...
- Guitar Pro中如何添加与删除音轨
Guitar Pro是一款专业的吉他打谱作曲软件,适合每一位热爱吉他并想进一步学习的大家.今天,我们一起来看看Guitar Pro软件写谱时音轨如何添加与删除. Guitar Pro能够同时支持虚拟音 ...
- 【Django试图与网址003】
Django中网址是写在 urls.py 文件中,用正则表达式对应 views.py 中的一个函数(或者generic类),我们用一个项目来演示. 一,首先,新建一个项目(project), 名称为 ...
- Pandas数据处理+Matplotlib绘图案例
利用pandas对数据进行预处理然后再使用matplotlib对处理后的数据进行数据可视化是数据分析中常用的方法. 第一组例子(星巴克咖啡店) 假如我们现在有这样一组数据:星巴克在全球的咖啡店信息,如 ...
- javascript 之 面向对象【创建对象】
创建对象 (1) 工厂模式 function createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = ag ...
- error——Fusion log——Debugging Assembly Loading Failures
原文 So...you're seeing a FileNotFoundException, FileLoadException, BadImageFormatException or you sus ...
- 用Tensorflow实现DCGAN
1. GAN简介 最近几年,深度神经网络在图像识别.语音识别以及自然语言处理方面的应用有了爆炸式的增长,并且都达到了极高的准确率,某些方面甚至超过了人类的表现.然而人类的能力远超出图像识别和语音识别的 ...
- 使用bootstrap-select有时显示“Nothing selected”
.html()后加 $('#courseList').selectpicker('refresh'); $('#courseList').selectpicker('render'); 来源