problem

Description

   策策同学特别喜欢逛公园。公园可以看成一张��个点��条边构成的有向图,且没有自环和重边。其中1号点是公园的入口,��号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的时间。策策每天都会去逛公园,他总是从1号点进去,从��号点出来。策策喜欢新鲜的事物,他不希望有两天逛公园的路线完全一样,同时策策还是一个特别热爱学习的好孩子,他不希望每天在逛公园这件事上花费太多的时间。如果1号点到��号点的最短路长为��,那么策策只会喜欢长度不超过�� + ��的路线。策策同学想知道总共有多少条满足条件的路线,你能帮帮他吗?为避免输出过大,答案对��取模。如果有无穷多条合法的路线,请输出−1。

Input

输入文件名为 park.in 。
第一行包含一个整数 ��, 代表数据组数。
接下来��组数据,对于每组数据:
第一行包含四个整数 ��,��,��,��,每两个整数之间用一个空格隔开。
接下来��行,每行三个整数�� �� ,�� �� ,�� �� , 代表编号为�� �� ,�� �� 的点之间有一条权值为 �� �� 的有向边,每两个整数之间用一个空格隔开。

Output

输出文件包含 ��行,每行一个整数代表答案。

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

样例说明:
对于第一组数据,最短路为 3。
1 – 5, 1 – 2 – 4 – 5, 1 – 2 – 3 – 5 为 3 条合法路径。

Data Constraint

对于不同的测试点,我们约定各种参数的规模 不会超过如下

对于 100%的数据, 1 ≤ �� ≤ 10^ 9 ,1 ≤ �� �� ,�� �� ≤ �� ,0 ≤ �� �� ≤ 1000。


analysis

有人说这是防AK题?不算吧……(只不过我并没有做出来顶乱用)

首先用邻接表存边跑一遍spfa,dis[i]dis[i]表示1到i的最短路长度(不要和我说你不会spfa)
设f[i][j]f[i][j]表示从1到i的所有路径里,比dis[n]dis[n]大K的路径条数
所以有

f[i][j]=∑f[k][dis[i]−dis[k]+j−len[i][k]]

f[i][j]=\sum f[k][dis[i]-dis[k]+j-len[i][k]]
看到这个,你以为是 DP
记忆化搜索!
我们从 nn开始倒着搜索,若dis[i]−dis[k]+j−len[i][k]<0dis[i]-dis[k]+j-len[i][k]<0当然也就不搜索了

那么我们最大的敌人——判0环呢?
若f[x][y]f[x][y]这个状态在一遍dfs里出现两次,那就是有0环,return就好,开个数组标记一下

finally

ans=(∑i=0nf[n][i])modp

ans=(\sum^{n}_{i=0}f[n][i])modp


code

#include<stdio.h>
#include<cstring>
#define MAXN 100001
#define MAXM 200001using namespace std;int last[MAXM],next[MAXM],tov[MAXM],len[MAXM];
int Last[MAXM],Next[MAXM],Tov[MAXM],Len[MAXM];
int dis[MAXN],queue[10*MAXN];
int f[MAXN][51],c[MAXN][51];
int n,m,k,p,t,tot,ans;
bool bo,bz[MAXN];void insert(int x,int y,int z)
{next[++tot]=last[x];last[x]=tot;tov[tot]=y;len[tot]=z;Next[tot]=Last[y];Last[y]=tot;Tov[tot]=x;Len[tot]=z;
}int dfs(int x,int k)
{if(~f[x][k])return f[x][k];c[x][k]=1;f[x][k]=0;for(int i=Last[x];i;i=Next[i]){int j=Tov[i],t=dis[x]-dis[j]+k-Len[i];if(t<0)continue;if(c[j][t])bo=0;(f[x][k]+=dfs(j,t))%=p;}c[x][k]=0;return f[x][k];
}int main()
{freopen("park.in","r",stdin);freopen("park.out","w",stdout);scanf("%d",&t);while (t--){scanf("%d%d%d%d",&n,&m,&k,&p);tot=0;memset(last,0,sizeof(last));memset(next,0,sizeof(next));memset(tov,0,sizeof(tov));memset(len,0,sizeof(len));memset(Last,0,sizeof(last));memset(Next,0,sizeof(next));memset(Tov,0,sizeof(tov));memset(Len,0,sizeof(len));memset(c,0,sizeof(c));memset(bz,1,sizeof(bz));memset(f,-1,sizeof(f));memset(dis,63,sizeof(dis));for (int i=1;i<=m;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);insert(x,y,z);}int head=0,tail=1;bz[1]=dis[1]=ans=0;queue[1]=1;while (head!=tail){head=(head+1==10*MAXN?0:head+1);int now=queue[head];for (int i=last[now];i;i=next[i]){int j=tov[i];if (dis[now]+len[i]<dis[j]){dis[j]=dis[now]+len[i];if (bz[j]){bz[j]=0;tail=(tail+1==10*MAXN?0:tail+1);queue[tail]=j;}}}bz[now]=1;}bo=1;f[1][0]=1;for (int i=0;i<=k;i++)(ans+=dfs(n,i))%=p;dfs(n,k+1);if (!bo){printf("-1\n");}else printf("%d\n",ans);}return 0;
}

JZOJ5475.【NOIP2017提高组】day1T3逛公园相关推荐

  1. 【NOIP2017提高组】逛公园

    逛公园 题目背景 NOIP2017提高组 DAY1 T3 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口,N 号点是公 ...

  2. 【NOIP 2017 提高组】逛公园

    [题目] 传送门 题目描述: 策策同学特别喜欢逛公园.公园可以看成一张 nnn 个点 mmm 条边构成的有向图,且没有自环和重边.其中 111 号点是公园的入口,nnn 号点是公园的出口,每条边有一个 ...

  3. 洛谷 P3953 [NOIP2017 提高组] 逛公园

    开始刷题单啦~,这部分的洛谷好题作为个人训练记录和以后复习用,有兴趣的可以一起做做 题目链接:P3953 [NOIP2017 提高组] 逛公园 题意都是中文就不翻译了 题解:这是一道记忆化+搜索的题目 ...

  4. NOIP2017提高组比赛总结

    NOIP2017提高组比赛总结 前言 转眼间,NOIP2017(经常叫他NOIP,其实全称是全国青少年信息学奥林匹克联赛)就这么过去了.回望这2个月,既有参加NOIP的激动,也有赛场上一些失利的遗憾. ...

  5. [NOIp2017提高组]奶酪(BFS)

    [NOIp2017提高组_Day2T1]奶酪 1 #include<iostream> 2 #include<stdio.h> 3 #include<vector> ...

  6. P3959 [NOIP2017 提高组] 宝藏

    P3959 [NOIP2017 提高组] 宝藏 题意: 额题意不好说,就是n个点m个边,选定一个点为根节点,构造一个最小生成树,边的权值为该该边起点到根节点之间的点的数量K(不含根节点) * 道路长度 ...

  7. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

  8. [NOIP2017 提高组] 时间复杂度

    题目 时间复杂度[NOIP2017提高组] 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明 ...

  9. 【NOIP2017提高组】列队

    题目背景 NOIP2017提高组 DAY2 T3 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵.Sylvia 所在的方阵中 ...

  10. P3951 [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目

    [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目 题目背景 NOIP2017 提高组 D1T1 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每 ...

最新文章

  1. HttpClient学习
  2. 图片底下配的文字叫什么_38岁孙俪越来越有女人味!穿短裙配性感黑丝美腿撩人,短发超美...
  3. android高级篇收录
  4. poj 3590 The shuffle Problem(置换群+DP)
  5. 《深入浅出WPF》笔记——绑定篇(一)
  6. Origin使用手册/笔记第二部分:数据的录入
  7. 信息学奥赛一本通(1220:单词接龙)
  8. JavaScript中String的replace函数
  9. 中英文翻译、语料库等资料
  10. java五大框架整理_五大Java常用框架整理!
  11. 《Nature》论文插图复刻第3期—面积图(Part2-100)
  12. HTML知识-CSS部分
  13. 在 pandas 中画树状图,使用 squarify 画树状图
  14. git gitlan 切糕入门
  15. python 获取硬盘信息失败请谨慎操作_老毛桃pe装机工具出现获取硬盘信息失败,请谨慎操作...
  16. 为什么学python要先学linux-为什么要学习 Linux?
  17. 深信服 2022届校园招聘 C++笔试编程题目
  18. 苹果推iOS游戏手柄,掌上游戏主机格局变天?
  19. kmeans聚类算法matlab实现
  20. 跨过顺丰的中通能终成霸主吗?

热门文章

  1. 3378: [Usaco2004 Open]MooFest 狂欢节
  2. 光线传媒与360合作敲定!双方建合资视频公司
  3. DTOJ 4878. 零一树
  4. web-jQuery笔记
  5. 从程序中学习EKF-SLAM(一)
  6. 背包问题(分支限界法)
  7. oracle查询销量最高的前8本图书_8月份打捆机热销品牌揭晓,竞争形势扑朔迷离...
  8. HTML5----字体rem,px,em,设置
  9. 关于人机若干问题的思考
  10. 计算与算计的区别是: