题目链接

思路

首先没有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. AQS实现原理分析——ReentrantLock

    在Java并发包java.util.concurrent中可以看到,不少源码是基于AbstractQueuedSynchronizer(以下简写AQS)这个抽象类,因为它是Java并发包的基础工具类, ...

  2. HTML5事件

    Html5事件 contextmenu事件 用以表示何时应该显示上下文菜单,以便开发人员取消默认的上下文菜单而提供自定义的菜单. 由于此事件时冒泡的,因此可以为document指定一个事件处理程序,用 ...

  3. ML.NET 示例:推荐之矩阵分解

    写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...

  4. 从.Net框架Bug的提交到修复代码成功合并到.NET CoreFX主线

    从发现.NET Framework中SmtpClient的Bug并拿出解决方案,然后给微软开发者社区提交Bug开始,总共耗时一个多月,对Bug修复的代码最终被采纳,现已合并到.NET Core Lib ...

  5. ZooKeeper: 简介, 配置及运维指南

    1. 概览 ZooKeeper是一个供其它分布式应用程序使用的软件, 它为其它分布式应用程序提供所谓的协调服务. 所谓的协调服务, 是指ZooKeeper的如下能力 naming 命名 configu ...

  6. python四:函数练习--小白博客

    为什么要有函数?函数式编程定义一次,多出调用函数在一定程度上可以理解为变量函数的内存地址加上()就是调用函数本身也可以当做参数去传参 不用函数:组织结构不清晰代码的重复性 def test():#te ...

  7. Codeforces Round #485 (Div. 2)-B-High School: Become Human

    B. High School: Become Human time limit per test 1 second memory limit per test 256 megabytes input ...

  8. ES6 Promise 详解

    一.概念 Promise,从语法上来讲,它是一个对象,是一个构造函数,可以获取 异步操作 的信息. 简单来讲,就是用同步的方式写异步代码,用来解决回调问题. 二.特点 Promise 对象有两个特点: ...

  9. python中变量、函数、类名、模块名等命名方式

    摘要:模块名:小写字母,单词之间用_分割ad_stats.py包名:和模块名一样类名:单词首字母大写AdStatsConfigUtil全局变量名(类变量,在java中相当于static变量):大写字母 ...

  10. Divisors of Two Integers CodeForces - 1108B (数学+思维)

    Recently you have received two positive integer numbers xx and yy. You forgot them, but you remember ...