题目链接

思路

首先没有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. arm汇编之 bne与beq

    在网上看了一些bne和beq的区别,但是对于初学者来说,容易越看越糊涂,因此简单介绍下: 我们先分析CPSR寄存器的Z标识位: cmp指令可以直接影响CPSR寄存器的Z标识位(条件位),从图中可以看出 ...

  2. odoo11登录之后返回的session信息分析

    { "id": null, "jsonrpc": "2.0", "result": { "web_tours& ...

  3. 史上最全面的Elasticsearch使用指南

    Elasticsearch使用指南 Elasticsearch使用指南 前言 ES是什么 什么是全文检索 ES的应用场景 ES的存储结构 第一章:安装 1.下载 2.解压 3.配置 4.启动 5.查看 ...

  4. HBase篇(5)- BloomFilter

    [每日五分钟搞定大数据]系列,HBase第五篇.上一篇我们落下了Bloom Filter,这次我们来聊聊这个东西. Bloom Filter 是什么? 先简单的介绍下Bloom Filter(布隆过滤 ...

  5. 朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑

    我承认,本文的标题有一点标题党,特别是写业务代码,大家因为没有足够重视一些细节最容易调的坑(侧重Java,当然,本文说的这些点很多是不限制于语言的). 1.客户端的使用 我们在使用Redis.Elas ...

  6. RPM包制作过程(一)

    本机环境:centos7,64位 1. 首先安装工具,rpmbuild可能在rpmdevtools里已经包含 #yum install rpm-devel.x86_64 #yum install rp ...

  7. 牛客练习赛B题 筱玛的排列(找递推规律)

    链接:https://ac.nowcoder.com/acm/contest/342/B来源:牛客网 筱玛的排列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语 ...

  8. jupyter使用

    jupyter使用 安装 在anaconda3的安装路径中,尽量避免使用汉字或者括号. 启动 在Windows上正确安装Anaconda3,确认配置好环境变量,然后再命令行中输入jupyter not ...

  9. asp.net mvc5 action多个参数

    需要完成http://site.com/user/add/1/2这样的url解析 使用action的参数直接获取数据的方式 Action声明如下 ) { ViewBag.clubID = id; ) ...

  10. vue-router的简单实现原理

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...