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 最短路 拓扑排序的更多相关文章

  1. NOIP2017逛公园(dp+最短路)

    策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策策每天都会 ...

  2. 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索

    题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...

  3. [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 ...

  4. [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...

  5. P3953 逛公园(dp,最短路)

    P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张NN个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,NN号点是公园的出口,每条边有一个非负权值, 代表策策经 ...

  6. 【洛谷】3953:逛公园【反向最短路】【记忆化搜索(DP)统计方案】

    P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...

  7. Luogu P3953 逛公园(最短路+记忆化搜索)

    P3953 逛公园 题面 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 \(N\) 个点 \(M\) 条边构成的有向图,且没有自环和重边.其中 \(1\) 号点是公园的入口,\(N\) 号点是公 ...

  8. [NOIP2017]逛公园 最短路+拓扑排序+dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...

  9. [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

    [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...

随机推荐

  1. ASP.NET 应用生命周期19个事件简介

    下面是请求管道中的19个事件. (1)BeginRequest: 开始处理请求 (2)AuthenticateRequest授权验证请求,获取用户授权信息 (3):PostAuthenticateRe ...

  2. 用jsx语法写iview事件

    普通的vue事件,在jsx中写法为 on+方法名(首字母大写) . 如:onClick={....}.onChange={....}.onBlur={....} iview中的事件,在vue中默认是 ...

  3. 如何在Maven和Gradle中配置使用Groovy 2.4与Spock 1.0

    如何在Maven和Gradle中配置使用Groovy 2.4与Spock 1.0 原文 https://dzone.com/articles/spock-10-groovy-24 翻译 hxfiref ...

  4. Linux下C程序的反汇编【转】

    转自:http://blog.csdn.net/u011192270/article/details/50224267 前言:本文主要介绍几种反汇编的方法. gcc gcc的完整编译过程大致为:预处理 ...

  5. SQL语句帮助大全

    --删除约束 Status:字段名 alter table Table_1 drop constraint Status; --添加约束 --Status :字段名 t_Pay_Order:表名 默认 ...

  6. 002_curl及postman专题

    一. 步骤 1: 下载cURL工具 使用您的Windows机器从cURL web站点下载最新版本的cURL: (1) 通常情况下,多数的Windows用户可以从官网下载页面http://curl.ha ...

  7. 安装pywin32模块

    1.先下载pywin32对于的版本 下载地址:python for windows extensions 2.选择自己对应的版本,我的是python3.5版本 注意注意注意:此处一定要看清楚自己的py ...

  8. 分别使用docx4j,jacob将文字与图片插入word中书签位置

    项目中需要将一段文字,与人员的签名(图片)插入到上传的word中,上网查询了一下,有许多种方式可以向word中插入文字,发现docx4j与jacob都为比较常见的解决方案,于是就先使用的docx4j进 ...

  9. Form 源码

    1. is_valid如果返回值如果为真 证明验证成功 意味着self.is_bound为True 和 self.errors为False def is_valid(self): return sel ...

  10. Jenkins 集成 Sonar

    Jenkins 与 Sonar 集成:Sonar 是 Jenkins 之外独立运行的一个服务.Jenkins 中安装插件 SonarQube(并配置其 Sonar Server 的 URL / Acc ...