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 建图 ...
随机推荐
- http Get和Post请求方式
string postURL ="http://xxxxx.ashx"; List<string> paramName = new List<string&g ...
- [Openwrt 扩展上篇]USB挂载&U盘启动&Samba共享
最近偷懒,没学习,反想起自己的路由刷了Openwrt,正好闲置了一个硬盘想拿来做个网络硬盘,于是开始了折腾....这里将不谈论如何刷Openwrt,如何ssh,如何添加PPOE,如何添加相对应服务的包 ...
- 20155303 2016-2017-2 《Java程序设计》第九周学习总结
20155303 2016-2017-2 <Java程序设计>第九周学习总结 目录 学习内容总结(Linux命令) 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- Linux USB驱动学习总结(二)---- USB设备驱动
USB 设备驱动: 一.USB 描述符:(存在于USB 的E2PROM里面) 1. 设备描述符:struct usb_device_descriptor 2. 配置描述符:struct usb_c ...
- nanosleep()
函数原型 #include <time.h> int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); 描述 ...
- 修改类不用重启Tomcat加载整个项目
可以修改类不用重启Tomcat加载整个项目(手工启动) 配置reloadable=true(自动重载) 使用Debug模式,前提是仅限于局部修改.(修改类不用重启--热加载) Tomcat轻小,而We ...
- spring学习之三 数据库操作jdbcTemplate
概念 jdbcTemplate就Spring对数据库持久化技术的实现,通过它可以对数据库进行CRUD等操作. JDBCTemplate和代码实现 public void jdbcadd() { Dri ...
- FM的推导原理--推荐系统
FM:解决稀疏数据下的特征组合问题 Factorization Machine(因子分解机) 美团技术团队的文章,觉得写得很好啊:https://tech.meituan.com/deep-unde ...
- 利用sys.dm_db_index_physical_stats查看索引碎片等数据
我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而索引在对数据进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,就需要重新组织或重新生成索引,以达到索引的最 ...