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. python学习笔记之split()方法与with

    Python split()方法 以下内容摘自:http://www.runoob.com/python/att-string-split.html 描述 Python split()通过指定分隔符对 ...

  2. STM32 IAP升级

    STM32 IAP在线升级,用Jlink设置读保护后前5K字节是默认加了写保护的,导致IAP升级时擦除和写入FLASH不成功,可以做两个boot,前5k为第一个boot程序,上电时负责跳转到APP还是 ...

  3. hibernate学习之一 框架配置

    hibernate 框架 1.hibernate框架应用在javaee三层结构中的dao层框架 2.好处就是不需要写复杂jdbc代码,不需要sql语句实现 3.是开源的轻量级框架 hibernate使 ...

  4. laravel 中provider的理解和使用

    https://segmentfault.com/q/1010000004640866

  5. Kaggle案例分析1--Bestbuy

    1. 引言 Kaggle是一个进行数据挖掘和数据分析在线竞赛网站, 成立于2010年. 与Kaggle合作的公司可以提供一个数据+一个问题, 再加上适当的奖励, Kaggle上的计算机科学家和数据科学 ...

  6. No.20 selenium学习之路之文件读写

    1.open 使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('thefile.tx ...

  7. 题解 UVA10048 【Audiophobia】

    这是一道很神奇的题 什么都不卡,就卡c++11(所以评测时要换成c++). 怎么说呐,其实就是跑一个弗洛依德,求图上两点间最大权值最小的路径,输出最大权值最小. P.S.本题n很小,直接floyd变形 ...

  8. Jdk 和 Tomcat的 安装。

    1.再分发服务器上下载JDK,然后利用xftp上传到聚石塔等 2. 解压: tar -zxvf jdk-8u121-linux-x64.tar.gz 3.配置环境变量: export JAVA_HOM ...

  9. Codeforces 931D Peculiar apple-tree(dfs+思维)

    题目链接:http://codeforces.com/contest/931/problem/D 题目大意:给你一颗树,每个节点都会长苹果,然后每一秒钟,苹果往下滚一个.两个两个会抵消苹果.问最后在根 ...

  10. MySQL学习笔记:少用Null

    在实际编程中,Null容易引起很多问题,例如在Java里NullPointerException猝不及防的空指针异常,因此需要过多的if判断,甚是麻烦. 在MySQL数据库中也要少用Null,尽量保持 ...