先跑一边dijkstra算出从1到i的最短距离dis[i]

然后建反向边 从n开始记忆化搜索,(p,k)表示1到p的距离=dis[p]+k的方案数

答案就是$\sum\limits_{i=0}^{k}{(n,i)}$

考虑0环,如果我记搜的时候搜到了0环,那答案就是-1,可以先用tarjan处理一下0边 看看有哪些点在零环上

(其实也可以开个栈 做到(p,k)的时候看(p,k)是不是已经在栈中了 如果是那就是-1)

 #include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
typedef pair<int,int> pa;
const int maxn=1e5+,maxm=2e5+,maxk=; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Edge{
int b,l,ne;
}eg[maxm],neg[maxm];
struct Node{
int p,k,n;
Node(int a=,int b=,int c=){p=a,k=b,n=c;}
};
int egh[maxn],negh[maxn],ect,nect;
int dis[maxn],f[maxn][maxk];
int dfn[maxn],tot,low[maxn],stk[maxn],sh;
int N,M,K,P;
bool in0[maxn],instk[maxn],flag[maxn]; inline void adeg(int a,int b,int c){
eg[++ect].b=b,eg[ect].l=c,eg[ect].ne=egh[a],egh[a]=ect;
neg[++nect].b=a,neg[nect].l=c,neg[nect].ne=negh[b],negh[b]=nect;
} void tarjan(int x){
dfn[x]=low[x]=++tot,instk[x]=,stk[++sh]=x;
for(int i=egh[x];i;i=eg[i].ne){
if(eg[i].l) continue;
int b=eg[i].b;
if(!dfn[b]) tarjan(b),low[x]=min(low[x],low[b]);
else if(instk[b]) low[x]=min(low[x],dfn[b]);
}
if(dfn[x]==low[x]){
int n=;
for(int i=sh;stk[i]!=x;i--) n++;
while(){
instk[stk[sh]]=;
in0[stk[sh]]=n>;
if(stk[sh--]==x) break;
}
}
} priority_queue<pa,vector<pa>,greater<pa> > q;
inline void dijkstra(){
while(!q.empty()) q.pop();
CLR(flag,);CLR(dis,);dis[]=;
q.push(make_pair(,));
while(!q.empty()){
int p=q.top().second;q.pop();
if(flag[p]) continue;
flag[p]=;
for(int i=egh[p];i;i=eg[i].ne){
int b=eg[i].b;
if(dis[b]>dis[p]+eg[i].l){
dis[b]=dis[p]+eg[i].l;
q.push(make_pair(dis[b],b));
}
}
}
} inline int solve(int x,int y){
// if(f[x][y]>=0) printf("get%d %d %d\n",x,y,f[x][y]);
if(y<||y>K) return ;
if(in0[x]) return -;
if(f[x][y]>=) return f[x][y];
f[x][y]=;
for(int i=negh[x];i;i=neg[i].ne){
int b=neg[i].b;
int re=solve(b,dis[x]-dis[b]+y-neg[i].l);
if(re==-) return -;
f[x][y]+=re,f[x][y]%=P;
}
return f[x][y];
} int main(){
int i,j,k;
for(int T=rd();T;T--){
N=rd(),M=rd(),K=rd(),P=rd();
CLR(egh,);ect=;
CLR(negh,);nect=;
for(i=;i<=M;i++){
int a=rd(),b=rd(),c=rd();
adeg(a,b,c);
}
CLR(dfn,);CLR(instk,);tot=;CLR(in0,);
for(i=;i<=N;i++)
if(!dfn[i]) tarjan(i);
dijkstra();
CLR(f,-);
f[][]=;int ans=;
for(i=;i<=K;i++)
ans+=solve(N,i),ans%=P;
printf("%d\n",ans<?-:ans);
} return ;
}

luogu3953 [NOIp2017]逛公园 (tarjan+dijkstra+记忆化搜索)的更多相关文章

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

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

  2. HDU1142 (Dijkstra+记忆化搜索)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  3. Luogu 3953[NOIP2017] 逛公园 堆优化dijkstra + 记忆化搜索

    题解 首先肯定是要求出单源最短路的,我用了堆优化dijikstra ,复杂度 mlogm,值得拥有!(只不过我在定义优先队列时把greater 打成了 less调了好久 然后我们就求出了$i$到源点的 ...

  4. HDU 1142 A Walk Through the Forest(Dijkstra+记忆化搜索)

    题意:看样子很多人都把这题目看错了,以为是求最短路的条数.真正的意思是:假设 A和B 是相连的,当前在 A 处, 如果 A 到终点的最短距离大于 B 到终点的最短距离,则可以从 A 通往 B 处,问满 ...

  5. 【UVA11324】 The Largest Clique (Tarjan+topsort/记忆化搜索)

    UVA11324 The Largest Clique 题目描述 给你一张有向图 \(G\),求一个结点数最大的结点集,使得该结点集中的任意两个结点 \(u\) 和 \(v\) 满足:要么 \(u\) ...

  6. 洛谷 P3953 逛公园【spfa+记忆化dfs+bfs】

    spfa预处理出最短路数组dis,然后反向建边bfs出ok[u]表示u能到n点 然后发现有0环的话时候有inf解的,先dfs找0环判断即可 然后dfs,设状态f[u][v]为到u点,还可以跑最短路+v ...

  7. Luogu3953 NOIP2017逛公园(最短路+拓扑排序+动态规划)

    跑一遍dij根据最短路DAG进行拓扑排序,按拓扑序dp即可.wa了三发感觉非常凉. #include<iostream> #include<cstdio> #include&l ...

  8. 逛公园 [NOIP2017 D1T3] [记忆化搜索]

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

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

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

随机推荐

  1. JavaScript对象访问器属性

    对象访问器就是setter和getter,他们的作用就是 提供另外一种方法来获取或者设置对象的属性值, 并且在获取和设置的时候,可以用一定的其他操作. 看下面代码: <script> va ...

  2. JEECG DataGridColumn dictionary使用问题

    <t:dgCol title="线索所属人"  field="ownerId"  query="true"  queryMode=&q ...

  3. b,B,KB,MB,GB,TB,PB,EB,ZB,YB,BB,NB,DB的含义,之间的关系

    1bit=1位2进制信息 1B (byte 字节)1KB(Kilobyte 千字节)=2(10)B=1024B=2(10)B: 1MB(Megabyte 兆字节)=2(10)KB=1024KB=2(2 ...

  4. vuex的购物车效果 index.js

    import Vue from 'vue'; import Vuex, { Store } from 'vuex'; import { stat } from 'fs'; Vue.use(Vuex); ...

  5. idea远程调试tomcat

    在开发Spring Boot应用的时候,会发现有的时候在idea工具中运行程序和打包程序后在tomcat下运行程序的结果会不太一样,因此就需要远程调试tomcat. 首先在tomcat目录下的bin目 ...

  6. 用户认证--------------auth模块

    一.auth模块 from django.contrib import auth 1 .authenticate()   :验证用户输入的用户名和密码是否相同 提供了用户认证,即验证用户名以及密码是否 ...

  7. 连接mysql 出现 1005 error(150) , error(121)的错误

    1.显示不能创建表 出现150错误 将检查是因为 我的user 表示拷贝过来的所以它设置的编码格式是utf-8 而我又新创建的表没有添加编码格式,所以它认为这两个关联的表之间的编码格式不匹配. 2.出 ...

  8. spring boot session error

    Error starting ApplicationContext. To display the conditions report re-run your application with 'de ...

  9. ArcGIS中使用异步回调函数查询图层Graphic

    在我们的地图的操作中经常会有一些操作是需要通过画多边形或者画线来查找某一块区域内的特定的Graphics比如我们在做的交警的项目中通过框选来查找某一块区域中的摄像机,某一块区域中的警力.警情.警员等相 ...

  10. PLSQL 错误问题:Datebase character set (AL32UTF-8) and Client character set (ZHS16GBK) are different.

    (解决不了,网上用的是Orecal,我用的只是客户端.) 网上找到解决方法 打开注册表(ctr+R,输入regedit),根据报错提示找到注册表位置,但本机是win10 64位系统,根据以上路径找不到 ...