(口胡)

去年刚学 A_star 的时候以为是板子,上午推了一会儿之后受教了

遇到最短路的题先建最短路 DAG,虽然有0边但是先跑一个 Dijkstra。

然后设 \(d[u]\) 是从 \(1\) 到 \(u\) 的最短路径长度, \(f[u][k]\) 是到节点 \(u\) 且路径长度为 \(d[u]+k\) 的路径条数。

那么似乎可以通过每一条边来转移这个类似背包的东西。

那么如果有一个环的长度不大于 \(k\) 呢?

我们不跑背包,将转移树(或者说转移 DAG)来数路径条数,也就是从 \((1,0)\) 到 \((n,0),(n,1)...(n,k)\) 的路径条数。

节点数量是 \(n \times k\) 的,可以通过,如果出现了无穷种方案那么一定出现了一个环,用拓扑排序判断即可。

感觉紫色严重恶评啊(

#include<cstdio>
#include<cctype>
typedef unsigned ui;
const ui M=1e5+5;
ui T,n,m,k,G,P,cnt,h[M],d[M],D[M],t[M<<2],id[M][51];ui u[M<<1],v[M<<1],w[M<<1];
struct Edge{
ui v,nx,w;
}e[M<<2];
inline ui Add(const ui&a,const ui&b){
return a+b>=P?a+b-P:a+b;
}
inline void Add(const ui&u,const ui&v,const ui&w){
e[++cnt]=(Edge){v,h[u],w};h[u]=cnt;
}
inline void Mdf(ui u,const ui&V){
if(~V)d[u]=V;for(D[u]=V,u=u+G>>1;u;u>>=1)t[u]=t[u<<1|(D[t[u<<1]]>D[t[u<<1|1]])];
}
inline void Dijkstra(){
ui u,v,E;for(u=2;u<=n;++u)D[u]=0x7fffffff;D[1]=0;for(G=1;G<=n+1;G<<=1);
for(u=1;u<=n;++u)t[u+G]=u;for(u=G-1;u>=1;--u)t[u]=t[u<<1|(D[t[u<<1]]>D[t[u<<1|1]])];
while(u=t[1])for(Mdf(u,-1),E=h[u];E;E=e[E].nx)if(d[u]+e[E].w-D[v=e[E].v]>>31)Mdf(v,d[u]+e[E].w);
for(u=1;u<=G+n;++u)t[u]=0;
}
struct Graph{
ui cnt,f[M*51],h[M*51],hd[M*51];bool t[M*51],vis[M*51],tag[M*51];ui L,R,q[M*51];
struct Edge{
ui v,nx;
}e[M*102],E[M*102];
inline void Add(const ui&u,const ui&v){
++cnt;e[cnt]=(Edge){v,h[u]};E[cnt]=(Edge){u,hd[v]};hd[v]=h[u]=cnt;
}
inline void init(){
ui e,u;q[L=R=1]=id[n][k];
while(L<=R)for(e=hd[u=q[L++]];e;e=E[e].nx)!t[e[E].v]&&(q[++R]=e[E].v),t[e[E].v]=true;
}
ui DFS(const ui&u){
ui E,x;if(vis[u])return-1;if(tag[u])return f[u];tag[u]=true;vis[u]=true;
for(E=h[u];E;E=e[E].nx,f[u]=::Add(f[u],x))if(!~(x=DFS(e[E].v)))return-1;return vis[u]=false,f[u];
}
}g;
inline ui read(){
ui n(0);char s;while(!isdigit(s=getchar()));while(n=n*10+(s&15),isdigit(s=getchar()));return n;
}
signed main(){
ui i,j;T=read();D[0]=-1;
while(T--){
n=read();m=read();k=read();P=read();for(i=1;i<=n;++i)for(j=0;j<=k;++j)id[i][j]=++cnt;cnt=0;
for(i=1;i<=k;++i)g.Add(id[n][i-1],id[n][k]);g.f[id[n][k]]=1;
for(i=1;i<=m;++i)u[i]=read(),v[i]=read(),w[i]=read(),Add(u[i],v[i],w[i]);Dijkstra();
for(i=1;i<=m;++i)for(j=0;j+d[u[i]]+w[i]-d[v[i]]<=k;++j)g.Add(id[u[i]][j],id[v[i]][j+d[u[i]]+w[i]-d[v[i]]]);
g.init();for(i=1;i<=id[n][k];++i)if(!g.t[i])g.tag[i]=true;j=g.DFS(1);printf(!~j?"-1\n":"%u\n",j);
for(cnt=g.cnt=0,i=1;i<=n;++i)for(h[i]=D[i]=j=0;j<=k+1;++j){
g.f[id[i][j]]=g.h[id[i][j]]=g.hd[id[i][j]]=g.t[id[i][j]]=g.vis[id[i][j]]=g.tag[id[i][j]]=0;id[i][j]=0;
}
}
}

LGP3953题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. linux计划任务之at

    at是单次的计划任务 1.首先安装at yum -y install at 2.开启atd服务 systemctl start atd systemctl enabled atd 3.常用命令 -m ...

  2. 关于CALayer的疑惑

  3. Xcode 插件推荐

    1. Alcatraz(建议安装,以下插件都可以在Alcatraz下载安装) 使用Alcatraz来下载管理Xcode插件, 2.下载安装注释插件VVDocumenter-Xcode. 3.使用代码对 ...

  4. 3.Flink实时项目之流程分析及环境搭建

    1. 流程分析 前面已经将日志数据(ods_base_log)及业务数据(ods_base_db_m)发送到kafka,作为ods层,接下来要做的就是通过flink消费kafka 的ods数据,进行简 ...

  5. AI模型运维——NVIDIA驱动、cuda、cudnn、nccl安装

    目前大部分使用GPU的AI模型,都使用的英伟达这套. 需要注意的是,驱动.cuda.cudnn版本需要一一对应,高低版本互不兼容. 驱动和cuda对应关系:https://docs.nvidia.co ...

  6. 《PHP程序员面试笔试宝典》——如何应对自己不会回答的问题?

    如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 在面试的过程中,对面试官提出的问题求职者并不是都能回答出来,计算机技术博大精深,很少有人能对计算机技术的各个分支学科了如 ...

  7. 5.Flink实时项目之业务数据准备

    1. 流程介绍 在上一篇文章中,我们已经把客户端的页面日志,启动日志,曝光日志分别发送到kafka对应的主题中.在本文中,我们将把业务数据也发送到对应的kafka主题中. 通过maxwell采集业务数 ...

  8. 我们一起来学Shell - 正则表达式

    文章目录 什么是正则表达式 正则表达式元字符 正则表达式应用举例 POSIX 方括号表达式 POSIX 字符集列表: 我们一起来学Shell - 初识shell 我们一起来学Shell - shell ...

  9. 医疗BI系统的数据分析是怎样的?

    在社会日益发展和信息化的过程中,已经发展处行业化.智能化的各类IT系统及子系统,如ERP.CRM.财务等等.实现经营流程数字化的同时,各行业企业的数据库日益庞大,医疗行业也不例外.我国医疗行业经过多年 ...

  10. Excel真的是三维地图可视化制作最好的选择吗?

    随着数据在当下互联网快速发展下变的维度更广,数量更大.结构越来越复杂,人们想要更加清晰,快速的认知和理解一份数据,传统的二维平面图表已经不能满足需求,三维可视化技术越结合多媒体技术.网络技术以及三维镜 ...