[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: 复制

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
输出样例#1: 复制

3
-1

说明

【样例解释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] 逛公园的更多相关文章

  1. NOIP2017 D1T3逛公园

    DP+最短路 两遍最短路判零环 DP转移f[i][j] 到点i的距离比最短路多j时的方案数 #include<bits/stdc++.h> using namespace std; ; s ...

  2. NOIP2017 D1T3 逛公园

    发现 \(K\) 很小,不妨设置一个 \(O(NK)\) 的 \(DP\). 发现可行的最短路必须满足是 \(d <= dis <= d + K\). 由逆向思维,则是从某点出发,可以消耗 ...

  3. 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索

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

  4. 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)

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

  5. Luogu P3953 [NOIP2017]逛公园

    题目 首先我们跑出从\(1\)出发的最短路\(d1\)和反图上从\(n\)出发的最短路\(dn\). 然后我们处理出长度不超过\(d1_n+k\)的最短路边集,给它拓扑排序. 如果存在环,那么这个环一 ...

  6. 洛谷 P3953 [ NOIP 2017 ] 逛公园 —— 最短路DP

    题目:https://www.luogu.org/problemnew/show/P3953 主要是看题解...还是觉得好难想啊... dfs DP,剩余容量的损耗是边权减去两点最短路差值...表示对 ...

  7. NOIP2017:逛公园

    Sol 发现\(NOIP2017\)还没\(AK\)??? 赶紧改 考场上明明打出了\(DP\),没时间了,没判环,重点是没初始化数组,爆\(0\) \(TAT\) 先最短路,然后\(f[i][j]\ ...

  8. 「NOIP2017」逛公园

    传送门 Luogu 解题思路 考虑 \(\text{DP}\). 设 \(f[u][k]\) 表示从 \(u\) 到 \(n\) 走过不超过 \(Mindis(u, n) + k\) 距离的方案数. ...

  9. 【NOIP2017】逛公园 最短路+DP

    诶,去年场上不会处理$0$的环,只拿了$60$有点可惜. 我们先不管边边权为$0$的边. 我们先跑一次最短路,令$dis[u]$表示从$1$至$u$的最短路的长度. 那么根据题目的要求,从起点走到$u ...

随机推荐

  1. GO函数

    函数定义 Go语言中定义函数使用func关键字. func 函数名(参数)(返回值){ 函数体 } 函数名:由字母.数字.下划线组成.但函数名的第一个字母不能是数字.在同一个包内,函数名也称不能重名( ...

  2. awk、sed、date命令使用

    个人学习笔记总结 [root@a ~]# awk 'END{print NR}' c.txt       #没错,这就是文件的行数,当然,这种统计方法不是linux下最快的,但也是一种思路3[root ...

  3. QT 添加外部库文件

    LIBS += D:\Code\Opengltest\OpenGL32.Lib D:\Code\Opengltest\GlU32.Lib LIBS += OpenGL32.Lib GlU32.Lib  ...

  4. tomcat服务器1

    1.在访问servlet时,一定要引入servlet-api.jar包 此包在Tomcat解压文件夹的lib子目录中,复制此包到Eclipse中的项目中WEB-INF的lib中,再右击Build Pa ...

  5. window bat 切换目录并执行php文件

    新建一个 test.bat文件,输入一下命令并保存 cmd /k "cd /d D:\PHPWAMP_IN2\phpwamp\server\Nginx-PHPWNMP\htdocs\test ...

  6. Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

    Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析 今天发一篇”水文”,可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍.本来以为花不了 ...

  7. 读取本地json文件,并转换为dictionary

    // 读取本地JSON文件 - (NSDictionary *)readLocalFileWithName:(NSString *)name { // 获取文件路径 NSString *path = ...

  8. 基于OpenCV做“三维重建”(4)--相机姿态还原和实现三维重建

    v当我们构建成功了viz,就可以使用3维效果给我们提供的便利,进一步进行一些3维的操作. 在这个动画中,注意图片后面的那个黑线,对应的是相机的位置. /*----------------------- ...

  9. 通过KSoap三方插件解析WebService接口方法

    话不多说,正文如下: 1.在lib中放入ksoap2的jar包并导入 2.在xml 配置文件中加入: <!-- 访问网络的权限 --> <uses-permission androi ...

  10. fusion使用——程序集绑定冲突工具

    1.以管理员身份运行vs命令提示符 2.运行 fuslogvw 3.以管理员身份运行Powershell To Enable:(确保fusion日志的文件夹D:\FusionLog\的存在) Set- ...