LOJ P3953 逛公园 NOIP dp 最短路 拓扑排序
https://www.luogu.org/problemnew/show/P3953
开o2过了不开o2re一个点。。。写法如题
顺便一提这道题在我校oj是a不了的因为我校土豆服务器速度奇慢1s时限
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
int n,m,k,p;
struct nod{
int y,v,next;
}e[][maxn*];
int head[][maxn]={};
int dis[][maxn]={};
int d[maxn]={},zz[maxn]={};
int mx,cnt=,ans=,tot=;
int f[][maxn]={};
bool vis[maxn]={};
queue< int >q;
void init(int x,int y,int v){
e[][++tot].y=y;e[][tot].v=v;e[][tot].next=head[][x];head[][x]=tot;
e[][tot].y=x;e[][tot].v=v;e[][tot].next=head[][y];head[][y]=tot;
}
void SPFA(int x,int z){
for(int i=;i<=n;i++)vis[i]=;
q.push(x);vis[x]=;dis[z][x]=;
int y,v,v1;
while(!q.empty()){
x=q.front();q.pop();v=dis[z][x];
for(int i=head[z][x];i;i=e[z][i].next){
y=e[z][i].y;v1=e[z][i].v;
if(dis[z][y]>v+v1){
dis[z][y]=v+v1;
if(!vis[y])q.push(y);
vis[y]=;
}
}
vis[x]=;
}
}
bool Topsort(){
for(int i=;i<=n;i++)d[i]=;
for(int i=;i<=n;i++){
for(int j=head[][i];j;j=e[][j].next){
if(e[][j].v+dis[][i]==dis[][e[][j].y])d[e[][j].y]++;//按照最短路连边
}
}cnt=;
for(int i=;i<=n;i++)if(!d[i])zz[++cnt]=i;
for(int i=;i<=cnt;i++){
for(int j=head[][zz[i]];j;j=e[][j].next){
if(e[][j].v+dis[][zz[i]]==dis[][e[][j].y]){
d[e[][j].y]--;
if(!d[e[][j].y])zz[++cnt]=e[][j].y;
}
}
}
for(int j=;j<=n;j++){//如果有0边构成的环,那么这个环一定到最后也有d
if(d[j]&&dis[][j]+dis[][j]<=k+dis[][n])return ;//如果环在合法路上就不用dp了有无数种方案
}return ;
}
void DP(){
for(int i=;i<=k;i++)
for(int j=;j<=n;j++)f[i][j]=;
ans=;f[][]=;
int y,v,x;
for(int i=;i<=k;i++){
for(int j=;j<=cnt;j++){
x=zz[j];if(dis[][x]==mx)continue;
for(int w=head[][x];w;w=e[][w].next){
y=e[][w].y;v=e[][w].v;
if(dis[][x]+v==dis[][y])f[i][y]=(f[i][y]+f[i][x])%p;//用拓扑序给f[k][i]汇总一下
}
}
for(int j=;j<=n;j++){//f[k][x]往下延伸
x=j;if(dis[][x]==mx)continue;
for(int w=head[][x];w;w=e[][w].next){
y=e[][w].y;v=e[][w].v;
if(dis[][x]+v!=dis[][y]){
if(i+dis[][x]+v-dis[][y]<=k)
f[i+dis[][x]+v-dis[][y]][y]=(f[i+dis[][x]+v-dis[][y]][y]+f[i][x])%p;
}
}
}ans=(ans+f[i][n])%p;
}
}
int main(){
//freopen("now.in","r",stdin);
int T;scanf("%d",&T);mx=(int)1e8;
while(T-->){
scanf("%d%d%d%d",&n,&m,&k,&p);
for(int i=;i<=n;i++)dis[][i]=dis[][i]=mx;
for(int i=;i<=n;i++)head[][i]=head[][i]=;tot=;
int x,y,v;
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&v);init(x,y,v);
}
SPFA(,);SPFA(n,);//cout<<dis[1][1]<<dis[0][n]<<endl;
if(dis[][]==mx)printf("0\n");
else{
if(Topsort()){
printf("-1\n");
}
else{
DP();
printf("%d\n",ans);
}
}
}
return ;
}
LOJ P3953 逛公园 NOIP dp 最短路 拓扑排序的更多相关文章
- NOIP2017逛公园(dp+最短路)
策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策策每天都会 ...
- 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索
题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...
- [luogu3952 noip2017] 逛公园 (计数dp+最短路)
传送门 Description Input Output 输出文件包含 T 行,每行一个整数代表答案. Sample Input 2 5 7 2 10 1 2 1 2 4 0 4 5 2 2 3 2 ...
- [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)
题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...
- P3953 逛公园(dp,最短路)
P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张NN个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,NN号点是公园的出口,每条边有一个非负权值, 代表策策经 ...
- 【洛谷】3953:逛公园【反向最短路】【记忆化搜索(DP)统计方案】
P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...
- Luogu P3953 逛公园(最短路+记忆化搜索)
P3953 逛公园 题面 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 \(N\) 个点 \(M\) 条边构成的有向图,且没有自环和重边.其中 \(1\) 号点是公园的入口,\(N\) 号点是公 ...
- [NOIP2017]逛公园 最短路+拓扑排序+dp
题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...
- [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)
[LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...
随机推荐
- 南京邮电大学CTF密码学部分Writeup
异性相吸 1.xor 2.hex2binary 3.len(bin(miwen))==len(bin(mingwen)) # -*- coding:utf-8 -*- file_de = open(' ...
- Java并发编程(3) JUC中的锁
一 前言 前面已经说到JUC中的锁主要是基于AQS实现,而AQS(AQS的内部结构 .AQS的设计与实现)在前面已经简单介绍过了.今天记录下JUC包下的锁是怎么基于AQS上实现的 二 同步锁 同步锁不 ...
- [转]Ubuntu下ROS开发环境搭建(QT+ros_qtc_plugin)
ROS与C++入门教程-搭建开发环境(QT+ros_qtc_plugin) PS : 在“安装ros_qtc_plugin插件”这一步中,原文提到“ Ubuntu 14.04使用apt-get方式安装 ...
- 存储过程简单Demo
--创建存储过程 delimiter // create procedure p1() begin end // --调用存储过程 call p1(); --删除存储过程 drop procedure ...
- 最长子串(Leetcode-3 Longest Substring Without Repeating Characters)
Question: Given a string, find the length of the longest substring without repeating characters. Exa ...
- 【Android开发日记】之入门篇(五)——Android四大组件之Service
这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的 ...
- Oracle学习笔记:11g服务介绍及哪些服务必须开启?
由于工作环境中oracle版本为10g,不支持行转列函数pivot,特在自己电脑上安装了oracle 11g,但因为不经常使用,便把服务自动启动给关闭了,只在需要使用时手动启动,因此记录一下需要启动的 ...
- 实际工作与JAVA面试题
1.String 和StringBuilder.StringBuffer 的区别? 答:Java 平台提供了两种类型的字符串:String和StringBuffer / StringBuilder,它 ...
- 一步一步学习IdentityServer3 (8)
IdentityServer3结合Hangfire及Cookies中间件实现授权 Idr3数据库Token过期管理 GlobalConfiguration.Configuration.UseSqlSe ...
- Spring Boot使用JavaMailSender发送邮件
http://www.cnblogs.com/wxc-xiaohuang/p/9532631.html https://blog.csdn.net/icannotdebug/article/detai ...