JZOJ5475.【NOIP2017提高组】day1T3逛公园
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]=\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=(\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逛公园相关推荐
- 【NOIP2017提高组】逛公园
逛公园 题目背景 NOIP2017提高组 DAY1 T3 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口,N 号点是公 ...
- 【NOIP 2017 提高组】逛公园
[题目] 传送门 题目描述: 策策同学特别喜欢逛公园.公园可以看成一张 nnn 个点 mmm 条边构成的有向图,且没有自环和重边.其中 111 号点是公园的入口,nnn 号点是公园的出口,每条边有一个 ...
- 洛谷 P3953 [NOIP2017 提高组] 逛公园
开始刷题单啦~,这部分的洛谷好题作为个人训练记录和以后复习用,有兴趣的可以一起做做 题目链接:P3953 [NOIP2017 提高组] 逛公园 题意都是中文就不翻译了 题解:这是一道记忆化+搜索的题目 ...
- NOIP2017提高组比赛总结
NOIP2017提高组比赛总结 前言 转眼间,NOIP2017(经常叫他NOIP,其实全称是全国青少年信息学奥林匹克联赛)就这么过去了.回望这2个月,既有参加NOIP的激动,也有赛场上一些失利的遗憾. ...
- [NOIp2017提高组]奶酪(BFS)
[NOIp2017提高组_Day2T1]奶酪 1 #include<iostream> 2 #include<stdio.h> 3 #include<vector> ...
- P3959 [NOIP2017 提高组] 宝藏
P3959 [NOIP2017 提高组] 宝藏 题意: 额题意不好说,就是n个点m个边,选定一个点为根节点,构造一个最小生成树,边的权值为该该边起点到根节点之间的点的数量K(不含根节点) * 道路长度 ...
- NOIP2017提高组模拟赛4 (总结)
NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...
- [NOIP2017 提高组] 时间复杂度
题目 时间复杂度[NOIP2017提高组] 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明 ...
- 【NOIP2017提高组】列队
题目背景 NOIP2017提高组 DAY2 T3 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵.Sylvia 所在的方阵中 ...
- P3951 [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目
[NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目 题目背景 NOIP2017 提高组 D1T1 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每 ...
最新文章
- HttpClient学习
- 图片底下配的文字叫什么_38岁孙俪越来越有女人味!穿短裙配性感黑丝美腿撩人,短发超美...
- android高级篇收录
- poj 3590 The shuffle Problem(置换群+DP)
- 《深入浅出WPF》笔记——绑定篇(一)
- Origin使用手册/笔记第二部分:数据的录入
- 信息学奥赛一本通(1220:单词接龙)
- JavaScript中String的replace函数
- 中英文翻译、语料库等资料
- java五大框架整理_五大Java常用框架整理!
- 《Nature》论文插图复刻第3期—面积图(Part2-100)
- HTML知识-CSS部分
- 在 pandas 中画树状图,使用 squarify 画树状图
- git gitlan 切糕入门
- python 获取硬盘信息失败请谨慎操作_老毛桃pe装机工具出现获取硬盘信息失败,请谨慎操作...
- 为什么学python要先学linux-为什么要学习 Linux?
- 深信服 2022届校园招聘 C++笔试编程题目
- 苹果推iOS游戏手柄,掌上游戏主机格局变天?
- kmeans聚类算法matlab实现
- 跨过顺丰的中通能终成霸主吗?