题目链接

思路

首先没有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 逛公园的更多相关文章

  1. 洛谷P3953 逛公园(NOIP2017)(最短/长路,拓扑排序,动态规划)

    洛谷题目传送门 又是一年联赛季.NOIP2017至此收官了. 这个其实是比较套路的图论DP了,但是细节有点恶心. 先求出\(1\)到所有点的最短路\(d1\),和所有点到\(n\)的最短路\(dn\) ...

  2. 洛谷P3953逛公园

    题目 作为\(NOIp2017D1T3\) 这个题还是很良心的,至少相对于\(NOIp2018\)来说,希望\(NOIp2019\)不会这么坑吧. 这个题可以作为记忆化搜索的进阶题了,做这个题的方法也 ...

  3. 洛谷P3953 逛公园

    DP+图论大毒瘤. 推荐这个博客. 先跑两遍最短路,搞掉一些无用点. 然后选出最短路上的边,做拓扑排序. 然后每层DP. 具体看代码. 用到的数组较多,记得清空. #include <cstdi ...

  4. 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]表示在被选择的集合当中. 大力记忆化搜索就行了. ...

  5. 洛谷P3953 逛公园 [noip2017] 图论+dp

    正解:图论(最短路)+dp(记忆化搜索) 解题报告: 这题真的是个好东西! 做了这题我才发现我的dij一直是错的...但是我以前用dij做的题居然都A了?什么玄学事件啊...我哭了TT 不过其实感觉还 ...

  6. 洛谷P3953 逛公园(dp 拓扑排序)

    题意 题目链接 Sol 去年考NOIP的时候我好像连最短路计数都不会啊qwq.. 首先不难想到一个思路,\(f[i][j]\)表示到第\(i\)个节点,与最短路之差长度为\(j\)的路径的方案数 首先 ...

  7. 洛谷 P3953 逛公园【spfa+记忆化dfs+bfs】

    spfa预处理出最短路数组dis,然后反向建边bfs出ok[u]表示u能到n点 然后发现有0环的话时候有inf解的,先dfs找0环判断即可 然后dfs,设状态f[u][v]为到u点,还可以跑最短路+v ...

  8. 洛谷 P1053 逛公园 解题报告

    P3953 逛公园 问题描述 策策同学特别喜欢逛公园. 公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,\(N\)号点是公园的出口,每条边有一个非负 ...

  9. UVA 1400."Ray, Pass me the dishes!" -分治+线段树区间合并(常规操作+维护端点)并输出最优的区间的左右端点-(洛谷 小白逛公园 升级版)

    "Ray, Pass me the dishes!" UVA - 1400 题意就是线段树区间子段最大和,线段树区间合并,但是这道题还要求输出最大和的子段的左右端点.要求字典序最小 ...

随机推荐

  1. 蓝牙BLE设备断线回连分析

    在 文章中分析了Hogp的连接的流程 ,这里分析一下回连的流程. 在使用ble设备的过程中,我们发现当设备和主机配对之后,如果没有解除配对,那么即便设备和主机断开,那么也是可以重新连接而不需要重新走配 ...

  2. C#开发微信门户及应用(46)-基于Bootstrap的微信门户应用管理系统功能介绍

    在前面介绍很多的微信框架,基本上都采用EasyUI的界面来搭建的微信框架,如随笔<C#开发微信门户及应用(8)-微信门户应用管理系统功能介绍>介绍的一样,不过随着微信的H5应用越来越多,因 ...

  3. 深入理解消息中间件技术之RabbitMQ服务

    什么叫消息队列? 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象. 消息队列(Message Queue)是一种应用间的通信方式, ...

  4. 最新版XCoder 的使用方法

    1.项目中,新建一个类库.名字随意,我取名:XCoder 2.右键 > 管理nuget程序包:搜索 XCode 并安装 3.在项目中新建:data.project.xml 的xml文件,并写入数 ...

  5. gulp + gulp-better-rollup + rollup 构建 ES6 开发环境

    gulp + gulp-better-rollup + rollup 构建 ES6 开发环境 关于 Gulp 就不过多啰嗦了.常用的 js 模块打包工具主要有 webpack.rollup 和 bro ...

  6. 剑指Offer-- 之字形顺序打印二叉树

    请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val ...

  7. Python学习第十二篇——切片的使用

    Python中使用函数切片可以创建副本,保留原本.现在给出如下代码 magicians_list = ['mole','jack','lucy'] new_lists = [] def make_gr ...

  8. Applese 的毒气炸弹 G 牛客寒假算法基础集训营4(图论+最小生成树)

    链接:https://ac.nowcoder.com/acm/contest/330/G来源:牛客网 Applese 的毒气炸弹 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262 ...

  9. JavaWeb连接SQLServer数据库并完成一个登录界面及其功能设计。

    一.JDBC连接SQLserver数据库的步骤: 1.下载SQLserver的JDBC驱动文件——Microsoft JDBC Driver 4.0 for SQL Server 2.例如下载得到的文 ...

  10. 敏捷开发、DevOps相关书籍——书单

    自己瞎整理的一些书单,都是豆瓣评分比较高的书,可以作为选择的一个参考. 书名 豆瓣链接 持续交付:发布可靠软件的系统方法 https://book.douban.com/subject/6862062 ...