洛谷 P3953 逛公园
思路
首先没有0边,且k为0的情况就是最短路计数。
如果k不为0,看到k<=50,想到dp。
设f[u][i]表示到达u点比最短路多走i的路径数,转移到v点。
f[u][i]+=f[v][i-(边权-(dis[u]-dis[v]))]
dis[]表示各点到n的最短路距离
如果有0边,需要判断-1的情况,如果在路径中存在0环,就有无数条路线。
具体判断可以用dfs,是否已经到达过并且没有走多余的路。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int N=;
const int M=;
int T,n,m,k,mod,cnt,cntr,ans,hd[M],hdr[M],dis[N],vis[N],f[N][],ind[N];
bool inq[N],cir;
queue<int>q;
struct edge
{
int to,nxt,val;
}v[M],vr[M];
void addedge(int x,int y,int z)
{
v[++cnt].nxt=hd[x];
v[cnt].to=y;
v[cnt].val=z;
hd[x]=cnt;
}void addedger(int x,int y,int z)
{
vr[++cntr].nxt=hdr[y];
vr[cntr].to=x;
vr[cntr].val=z;
hdr[y]=cntr;
}
int add(int x,int y)
{
x+=y;
if(x>=mod)
x-=mod;
return x;
}
void init()
{
cir=;
cnt=cntr=ans=;
memset(hd,,sizeof(hd));
memset(hdr,,sizeof(hdr));
memset(dis,0x3f,sizeof(dis));
memset(vis,,sizeof(vis));
memset(f,-,sizeof(f));
}
void spfa()
{
q.push(n);
inq[n]=;
dis[n]=;
while(!q.empty())
{
int u=q.front();
q.pop();
inq[u]=;
for(int i=hdr[u];i;i=vr[i].nxt)
if(dis[vr[i].to]>dis[u]+vr[i].val)
{
dis[vr[i].to]=dis[u]+vr[i].val;
if(!inq[vr[i].to])
{
inq[vr[i].to]=;
q.push(vr[i].to);
}
}
}
}
int dfs(int u,int res)
{
if(vis[u]&&ind[u]==res)
{
cir=;
return ;
}
if(f[u][res]>=)
return f[u][res];
int t=;
if(u==n&&!res)
t++;
ind[u]=res;
vis[u]++;
for(int i=hd[u];i;i=v[i].nxt)
{
int x=res-(v[i].val-(dis[u]-dis[v[i].to]));
if(x>=&&x<=k)
t=add(t,dfs(v[i].to,x));
if(cir)
return ;
}
vis[u]--;
ind[u]=;
f[u][res]=t;
return f[u][res];
}
int main()
{
scanf("%d",&T);
while(T--)
{
init();
scanf("%d%d%d%d",&n,&m,&k,&mod);
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
addedge(x,y,z),addedger(x,y,z);
}
spfa();
for(int i=;i<=k;i++)
if(!cir)
ans=add(ans,dfs(,i));
if(cir)
printf("-1\n");
else
printf("%d\n",ans);
}
return ;
}
洛谷 P3953 逛公园的更多相关文章
- 洛谷P3953 逛公园(NOIP2017)(最短/长路,拓扑排序,动态规划)
洛谷题目传送门 又是一年联赛季.NOIP2017至此收官了. 这个其实是比较套路的图论DP了,但是细节有点恶心. 先求出\(1\)到所有点的最短路\(d1\),和所有点到\(n\)的最短路\(dn\) ...
- 洛谷P3953逛公园
题目 作为\(NOIp2017D1T3\) 这个题还是很良心的,至少相对于\(NOIp2018\)来说,希望\(NOIp2019\)不会这么坑吧. 这个题可以作为记忆化搜索的进阶题了,做这个题的方法也 ...
- 洛谷P3953 逛公园
DP+图论大毒瘤. 推荐这个博客. 先跑两遍最短路,搞掉一些无用点. 然后选出最短路上的边,做拓扑排序. 然后每层DP. 具体看代码. 用到的数组较多,记得清空. #include <cstdi ...
- 2018.11.01 洛谷P3953 逛公园(最短路+dp)
传送门 设f[i][j]f[i][j]f[i][j]表示跟最短路差值为iii当前在点jjj的方案数. in[i][j]in[i][j]in[i][j]表示在被选择的集合当中. 大力记忆化搜索就行了. ...
- 洛谷P3953 逛公园 [noip2017] 图论+dp
正解:图论(最短路)+dp(记忆化搜索) 解题报告: 这题真的是个好东西! 做了这题我才发现我的dij一直是错的...但是我以前用dij做的题居然都A了?什么玄学事件啊...我哭了TT 不过其实感觉还 ...
- 洛谷P3953 逛公园(dp 拓扑排序)
题意 题目链接 Sol 去年考NOIP的时候我好像连最短路计数都不会啊qwq.. 首先不难想到一个思路,\(f[i][j]\)表示到第\(i\)个节点,与最短路之差长度为\(j\)的路径的方案数 首先 ...
- 洛谷 P3953 逛公园【spfa+记忆化dfs+bfs】
spfa预处理出最短路数组dis,然后反向建边bfs出ok[u]表示u能到n点 然后发现有0环的话时候有inf解的,先dfs找0环判断即可 然后dfs,设状态f[u][v]为到u点,还可以跑最短路+v ...
- 洛谷 P1053 逛公园 解题报告
P3953 逛公园 问题描述 策策同学特别喜欢逛公园. 公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,\(N\)号点是公园的出口,每条边有一个非负 ...
- UVA 1400."Ray, Pass me the dishes!" -分治+线段树区间合并(常规操作+维护端点)并输出最优的区间的左右端点-(洛谷 小白逛公园 升级版)
"Ray, Pass me the dishes!" UVA - 1400 题意就是线段树区间子段最大和,线段树区间合并,但是这道题还要求输出最大和的子段的左右端点.要求字典序最小 ...
随机推荐
- arm汇编之 bne与beq
在网上看了一些bne和beq的区别,但是对于初学者来说,容易越看越糊涂,因此简单介绍下: 我们先分析CPSR寄存器的Z标识位: cmp指令可以直接影响CPSR寄存器的Z标识位(条件位),从图中可以看出 ...
- odoo11登录之后返回的session信息分析
{ "id": null, "jsonrpc": "2.0", "result": { "web_tours& ...
- 史上最全面的Elasticsearch使用指南
Elasticsearch使用指南 Elasticsearch使用指南 前言 ES是什么 什么是全文检索 ES的应用场景 ES的存储结构 第一章:安装 1.下载 2.解压 3.配置 4.启动 5.查看 ...
- HBase篇(5)- BloomFilter
[每日五分钟搞定大数据]系列,HBase第五篇.上一篇我们落下了Bloom Filter,这次我们来聊聊这个东西. Bloom Filter 是什么? 先简单的介绍下Bloom Filter(布隆过滤 ...
- 朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑
我承认,本文的标题有一点标题党,特别是写业务代码,大家因为没有足够重视一些细节最容易调的坑(侧重Java,当然,本文说的这些点很多是不限制于语言的). 1.客户端的使用 我们在使用Redis.Elas ...
- RPM包制作过程(一)
本机环境:centos7,64位 1. 首先安装工具,rpmbuild可能在rpmdevtools里已经包含 #yum install rpm-devel.x86_64 #yum install rp ...
- 牛客练习赛B题 筱玛的排列(找递推规律)
链接:https://ac.nowcoder.com/acm/contest/342/B来源:牛客网 筱玛的排列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语 ...
- jupyter使用
jupyter使用 安装 在anaconda3的安装路径中,尽量避免使用汉字或者括号. 启动 在Windows上正确安装Anaconda3,确认配置好环境变量,然后再命令行中输入jupyter not ...
- asp.net mvc5 action多个参数
需要完成http://site.com/user/add/1/2这样的url解析 使用action的参数直接获取数据的方式 Action声明如下 ) { ViewBag.clubID = id; ) ...
- vue-router的简单实现原理
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...