NOIP2017 D1T3逛公园
DP+最短路
两遍最短路判零环
DP转移f[i][j] 到点i的距离比最短路多j时的方案数
#include<bits/stdc++.h>
using namespace std;
const int N=;
struct node
{
int to,nex,w;
}e[N],z[N];
int cnt,cnt1,head[],head2[];
int add(int x,int y,int w)
{
e[++cnt1].to=y;e[cnt1].w=w;e[cnt1].nex=head[x];head[x]=cnt1;
z[++cnt].to=x;z[cnt].w=w;z[cnt].nex=head2[y];head2[y]=cnt;
}
int f[][];
int d1[],d2[],d[],qq[N<<];
bool v[];int n,m,k,p;
void update(int &a,int b)
{
a=(a+b)%p;
}
queue<int>q;
void work()
{
scanf("%d%d%d%d",&n,&m,&k,&p);cnt=,cnt1=;
memset(head,,sizeof(head));
memset(head2,,sizeof(head2));
for(int i=;i<=m;++i)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
}
memset(v,,sizeof(v));memset(d1,0x3f,sizeof(d1));
q.push();d1[]=;v[]=;
while(!q.empty())
{
int x=q.front();q.pop();v[x]=;
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(d1[y]>d1[x]+e[i].w)
{
d1[y]=d1[x]+e[i].w;
if(!v[y])
{
q.push(y);v[y]=;
}
}
}
}
memset(v,,sizeof(v));memset(d2,0x3f,sizeof(d2));
q.push(n);d2[n]=;v[n]=;
while(!q.empty())
{
int x=q.front();q.pop();v[x]=;
for(int i=head2[x];i;i=z[i].nex)
{
int y=z[i].to;
if(d2[y]>d2[x]+z[i].w)
{
d2[y]=d2[x]+z[i].w;
if(!v[y])
{
q.push(y);v[y]=;
}
}
}
}
int top=;memset(d,,sizeof(d));
for(int i=;i<=n;++i)
for(int j=head[i];j;j=e[j].nex)
{
if(d1[i]+e[j].w==d1[e[j].to])d[e[j].to]++;
}
for(int i=;i<=n;++i)if(!d[i])qq[++top]=i;
for(int i=;i<=top;++i)
{
int x=qq[i];
for(int j=head[x];j;j=e[j].nex)
if(d1[x]+e[j].w==d1[e[j].to])
{
int y=e[j].to;
d[y]--;
if(d[y]==)qq[++top]=y;
}
}
for(int i=;i<=n;++i)
if(d[i]&&d1[i]+d2[i]<=d1[n]+k)
{
puts("-1");return;
}
int ans=;
memset(f,,sizeof(f));
f[][]=;
for(int i=;i<=k;++i)
{
for(int j=;j<=top;++j)
for(int u=head[qq[j]];u;u=e[u].nex)
{
if(d1[qq[j]]+e[u].w==d1[e[u].to])
update(f[e[u].to][i],f[qq[j]][i]);
}
for(int j=;j<=n;++j)
for(int u=head[j];u;u=e[u].nex)
{
if(d1[j]+e[u].w!=d1[e[u].to]&&i+d1[j]-d1[e[u].to]+e[u].w<=k)
update(f[e[u].to][i+d1[j]-d1[e[u].to]+e[u].w],f[j][i]);
}
}
for(int i=;i<=k;++i)
update(ans,f[n][i]);
printf("%d\n",ans);
return ;
}
int main()
{
int t;scanf("%d",&t);
while(t--)
{
work();
}
return ;
}
NOIP2017 D1T3逛公园的更多相关文章
- [luogu P3953] [noip2017 d1t3] 逛公园
[luogu P3953] [noip2017 d1t3] 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N ...
- NOIP2017 D1T3 逛公园
发现 \(K\) 很小,不妨设置一个 \(O(NK)\) 的 \(DP\). 发现可行的最短路必须满足是 \(d <= dis <= d + K\). 由逆向思维,则是从某点出发,可以消耗 ...
- 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索
题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...
- 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)
题意: 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花 ...
- NOIP2017:逛公园
Sol 发现\(NOIP2017\)还没\(AK\)??? 赶紧改 考场上明明打出了\(DP\),没时间了,没判环,重点是没初始化数组,爆\(0\) \(TAT\) 先最短路,然后\(f[i][j]\ ...
- 【NOIP2017】逛公园 最短路+DP
诶,去年场上不会处理$0$的环,只拿了$60$有点可惜. 我们先不管边边权为$0$的边. 我们先跑一次最短路,令$dis[u]$表示从$1$至$u$的最短路的长度. 那么根据题目的要求,从起点走到$u ...
- LOJ2316. 「NOIP2017」逛公园【DP】【最短路】【思维】
LINK 思路 因为我想到的根本不是网上的普遍做法 所以常数出奇的大,而且做法极其暴力 可以形容是带优化的大模拟 进入正题: 首先一个很显然的思路是如果在合法的路径网络里面存在零环是有无数组解的 然后 ...
- 【NOIP2017】逛公园 D1 T3
记忆化搜索 跑一次反向的最短路求出MinDis(u,n)MinDis(u,n)MinDis(u,n) f[u][k]f[u][k]f[u][k]表示dis(u,n)<=MinDis(u,n)+d ...
- 【LOJ2316】「NOIP2017」逛公园
[题目链接] [点击打开链接] [题目概括] 对给定\(K\),起点\(1\)到终点\(n\)中对长度为\([L,L+K]\)的路径计数. \(L\)为\(1\)到\(n\)的最短路长度. [思路要点 ...
随机推荐
- 【洛谷 P2472】 [SCOI2007]蜥蜴 (最大流)
题目链接 简单网络流. 源点向蜥蜴连流量为\(1\)的边. 能跳出去的点向汇点连流量为\(INF\)的边. 把每个点拆成\(2\)个点,\(O(n^4)\)枚举两两点,如果距离小于等于\(d\),就互 ...
- 2017ACM暑期多校联合训练 - Team 2 1001 HDU 6045 Is Derek lying? (模拟)
题目链接 Problem Description Derek and Alfia are good friends.Derek is Chinese,and Alfia is Austrian.Thi ...
- TinyOS在ubuntu 14.04下安装教程
1:打开/etc/apt/sources.list 文件,在文件最底部添加安装源: deb http://tinyos.stanford.edu/tinyos/dists/ubuntu lucid m ...
- JavaScript实现水平进度条拖拽效果
<html> <head> <meta charset="UTF-8"> <title>Document</title> ...
- phinx:php数据库迁移
Phinx使你的php app进行数据迁移的过程变得异常轻松,在五分钟之内你就可以安装好Phinx 并进行数据迁移. 特性 使用php代码进行数据迁移 部署模式下迁移 五分钟之内使用 不再担心数据库的 ...
- Postgres中tuple的组装与插入
1.相关的数据类型 我们先看相关的数据类型: HeapTupleData(src/include/access/htup.h) typedef struct HeapTupleData { uint3 ...
- ubuntu的su初始密码设置
Ubuntu刚安装后,不能在terminal中运行su命令,因为root没有默认密码,需要手动设定. 以安装ubuntu时输入的用户名登陆,该用户在admin组中,有权限给root设定密码. 给roo ...
- C#:Excel上传服务器后导入数据库
- (二)Spring 之IOC 详解
第一节:spring ioc 简介 IOC(控制反转:Inversion of Control),又称作依赖注入dependency injection( DI ),是一种重要的面向对象编程的法则来削 ...
- SVN文件上感叹号、加号、问号等图标的原因
黄色感叹号(有冲突): --这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别 ...