题目链接

思路

首先没有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. Generative Adversarial Nets[Wasserstein GAN]

    本文来自<Wasserstein GAN>,时间线为2017年1月,本文可以算得上是GAN发展的一个里程碑文献了,其解决了以往GAN训练困难,结果不稳定等问题. 1 引言 本文主要思考的是 ...

  2. 在.NET中调用Java的类

    .NET不能直接调用Java的类,但IKVM.NET解决了这个问题. IKVM.NET提供了两种方式调用java的类: ①把生成的jar包放置在程序根目录,然后通过创建URL实例的方式去调用类中的方法 ...

  3. [Spark][Flume]Flume 启动例子

    Flume 启动例子: flume-ng agent --conf /etc/flume-ng/conf --conf-file /etc/flume-ng/conf/flume.conf --nam ...

  4. eclipse maven设置

    eclipse 4.4以上版本集成了maven,只需配置一下即可,如果你的eclipse 没有安装maven,可以参考这个文章.http://marketplace.eclipse.org/conte ...

  5. Xamarin Android ListView 控件使用

    在项目中通常用到了ListView控件,示例如下: create the listitem class ,eg; public class ColorItem { public string Colo ...

  6. element ui主题色跟换

    node_modules\ element ui\ lib\ theme-dafault  下载的主题色替换掉改文件... ================== 但是会出现  搜索框iocon 样式换 ...

  7. 关于function和task的说明

    1.  关于函数function调用,总结两个要点: 1.  函数调用一般产生一个值,这个值被赋值给某个变量 2.  函数所返回的值只能是一个,不可以是多个,不能像C语言中采用指针的方式返回多个值.因 ...

  8. python_format格式化输出、while else、逻辑运算符、编码初识

    1.格式化输出 .%d  %s  格式化输出:% 占位符,d 表示替换整型数,s表示要替换字符串. name = input('请输入名字:') age = input('请输入年龄:') sex = ...

  9. Python爬虫:爬取人人都是产品经理的数据

    爬取内容: 人人都是产品经理首页(www.woshipm.com)左侧[最新文章]下如图样式的文章标题.浏览量和缩略图. 思路: 1. 用BeautifulSoup解析网页 变量名 = Beautif ...

  10. MyEclipse 配置 Tomcat

    安装好Tomcat,MyEclipse 之后,利用这两个工具可以开发部署Web 应用,步骤相对手动部署要简洁的多,这里有一个特别要注意的地方:系统里安装JDK.Tomcat.MyEclipse 的版本 ...