【题解】洛谷P3953 [NOIP2017TG] 逛公园(记忆化搜索+SPFA)
题目来源:洛谷P3953
思路
先用SPFA求一遍最短路
在求最短路的同时可以把所有点到终点的最短路求出来 dis数组
注意要反向SPFA 因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加
我们定一个f[u][k]数组为从当前节点u还剩时间k到达终点的方案
原来从u走到终点的最短路径消耗时间为dis[u]
而我们现在考虑走(u,v,w)这条边(不是最短路)
那么比走最短路需要多dis[v]+w-dis[u]的时间
所以f[u][k]=∑f[v][k-(dis[v]+w-dis[u])] (从u到终点上有另一个点v)
记忆化搜索即可
PS:容易错的地方是没有初始化
代码
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define maxn 100010
#define INF 1e9+7
int T,n,m,k,p,cnt,limit,ans;
int dis[maxn],h1[maxn],h2[maxn],f[maxn][];
bool vis[maxn],v[maxn][];
struct Edge
{
int to;
int next;
int w;
}e1[maxn*],e2[maxn*];
void add(int u,int v,int w)
{
e1[++cnt].to=v;
e1[cnt].w=w;
e1[cnt].next=h1[u];
h1[u]=cnt;
e2[cnt].to=u;
e2[cnt].w=w;
e2[cnt].next=h2[v];
h2[v]=cnt;
}
void spfa()//反向SPFA
{
queue<int> q;
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++) dis[i]=INF;
q.push(n);
dis[n]=;
vis[n]=;
while(!q.empty())
{
int temp=q.front();
q.pop();
vis[temp]=;
for(int i=h2[temp];i;i=e2[i].next)
{
int v=e2[i].to;
if(dis[v]>dis[temp]+e2[i].w)
{
dis[v]=dis[temp]+e2[i].w;
if(!vis[v])
{
vis[v]=;
q.push(v);
}
}
}
}
}
int dfs(int u,int k)
{
if(v[u][k]) return -;//如果一条路上一个点第二次到达 说明有环
if(f[u][k]) return f[u][k];//记忆化
v[u][k]=;
if(u==n) f[u][k]=;//边界条件 到达终点还剩k步方案数为1
else f[u][k]=;//否则为0
for(int i=h1[u];i;i=e1[i].next)
{
int v=e1[i].to;
int temp=dis[v]-dis[u]+e1[i].w;//判断每一条路相比最短路是否超过k
if(temp<=k)//没超过
{
int w=dfs(v,k-temp);//继续dfs 记得减去剩余时间
if(w==-) return f[u][k]=-;
f[u][k]=(f[u][k]+w)%p;//记录方案数
}
}
v[u][k]=;//重置点
return f[u][k];
}
int main()
{
cin>>T;
while(T--)
{
cnt=,ans=;
memset(h1,,sizeof(h1));//记得初始化
memset(h2,,sizeof(h2));
memset(f,,sizeof(f));
memset(v,,sizeof(v));
cin>>n>>m>>k>>p;
for(int i=;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
}
spfa();
cout<<dfs(,k)<<endl;//ans在dfs(1,k)中
}
}
【题解】洛谷P3953 [NOIP2017TG] 逛公园(记忆化搜索+SPFA)的更多相关文章
- 洛谷3953 (NOIp2017) 逛公园——记忆化搜索+用栈判0环
题目:https://www.luogu.org/problemnew/show/P3953 因为K只有50,所以想到用dp[ cr ][ j ]表示在点cr.比最短路多走了 j 的方案数.(看了TJ ...
- NOIP 2017 逛公园 记忆化搜索 最短路 好题
题目描述: 策策同学特别喜欢逛公园.公园可以看成一张N个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. ...
- 洛谷P1192 台阶问题【记忆化搜索】
题目:https://www.luogu.org/problemnew/show/P1192 题意: 给定n和k,一个人一次可以迈1~k步,问走n步有多少种方案. 思路: 本来傻乎乎上来就递归,显然会 ...
- 洛谷P1040 加分二叉树【记忆化搜索】
题目链接:https://www.luogu.org/problemnew/show/P1040 题意: 某一个二叉树的中序遍历是1~n,每个节点有一个分数(正整数). 二叉树的分数是左子树分数乘右子 ...
- 洛谷P3953 [NOIP2017]逛公园
K<=50,感觉可以DP 先建反图求出从n到各个点的最短路,然后在正图上DP 设f[当前点][比最短路多走的距离]=方案数 转移显然是 $f[v][res]=\sum f[u][res+tmp] ...
- 洛谷 P1141【BFS】+记忆化搜索+染色
题目链接:https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字 0 与 1 组成的n×n 格迷宫.若你位于一格0上,那么你可以移动到相邻 4 ...
- 洛谷P3906 Hoof Paper, Scissor (记忆化搜索)
这道题问的是石头剪刀布的的出题问题 首先不难看出这是个dp题 其次这道题的状态也很好确定,之前输赢与之后无关,确定三个状态:当前位置,当前手势,当前剩余次数,所以对于剪刀,要么出石头+1分用一次机会, ...
- 【洛谷1434 [SHOI2002]滑雪】记忆化搜索
AC代码 #include <bits/stdc++.h> using namespace std; #define ms(a,b) memset(a,b,sizeof(a)) typed ...
- 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...
随机推荐
- SQLSTATE[HY000] [2002] No such file or directory in
这个错误将数据库配置信息的localhost改成127.0.0.1就行了
- ugui之圆角矩形头像实现
这个是参考大神的修改了一下渲染方式实现的,可以去查看原帖的,原贴是圆形头像,原理讲的非常详细 点击这里 我写的这个只支持正方形图片,效果是酱紫的~ 一共三个代码,还需要两个代码,原帖里都有的,我只是修 ...
- jQuery知识点学习整理
零.jQuery中操作css的方法 1.$("p").css("background-color"); 返回首个匹配元素的background-color的值. ...
- Hibernate 注解(Annotations 二)一对一双向注解
注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来 ...
- git 命令收藏
git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config -- ...
- spring org.springframework.web.bind.annotation 常用注解
开发中常用的注解记录,查缺补漏 Request注解 @RequestBody @RequestHeader @RequestMapping @RequestParam @RequestPart @Co ...
- 12_Redis缓存穿透
[何为缓存穿透] 缓存穿透是查询一个一定不存在的数据,这样的请求都要到存储层MySql去查询,失去了缓存的意义,在流量大时,可能MySql就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是 ...
- Java中由Calendar类获取的月、天和小时的简单处理
在Java中,Calendar是日期处理的一个重要的类.但是,我们使用Calendar获取的月份,天,小时等可能需要进行简单的处理才能满足我们的需要.比如,月份范围是0-11,而我们可能需要的是1-1 ...
- 函数arguments对象
一.arguments对象 arguments 是一个对应于传递给函数的参数的类数组对象. 二.语法 arguments 三.描述 arguments对象是所有(非箭头)函数中都可用的局部变量.你可以 ...
- glyphicons-halflings-regular.woff2 not found 前台错误修正
错误内容如下: 首先在 web.config 里面加上如下内容: <system.webServer> <staticContent> <remove fileExten ...