(口胡)

去年刚学 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. B/S与C/S

    B/S结构(Browser/Server,浏览器/服务器模式),是web兴起后的一种网络结构模式,web浏览器是客户端最主要的应用软件.这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简 ...

  2. 使用df -h命令查看磁盘空间使用率不算高,还有很多空余空间,但是创建文件或写入数据时一直报错磁盘写满

    关于磁盘空间中索引节点爆满的问题还是挺多的,借此跟大家分享一下: 一.发现问题 在公司一台配置较低的Linux服务器(内存.硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h ...

  3. Java8 Stream 的一些操作和介绍

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11858186.html Java8 Stream 是一个新的东西, 就是能够将常见的数据结构转 ...

  4. zookeeper集群+kafka集群 部署

    zookeeper集群 +kafka 集群部署 1.Zookeeper 概述: Zookeeper 定义 zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目 Zooke ...

  5. 了解Spark

    Apache Spark是一个开源的集群计算框架,主要用来处理实时生成的数据. Spark是建立在Hadoop的MapReduce顶部.它被优化到了内存中运行,而MapReduce等替代方法是将数据写 ...

  6. JVM性能调优与实战基础理论篇-中

    JVM内存模型 概述 我们所说的JVM内存模型是指运行时数据区,用New出来的对象放在堆中,如每个线程中局部变量放在栈或叫虚拟机栈中,下图左边区域部分为栈内存的结构.如main线程包含程序炯酸器.线程 ...

  7. Solution -「多校联训」假人

    \(\mathcal{Description}\)   Link.   一种物品有 长度 和 权值 两种属性,现给定 \(n\) 组物品,第 \(i\) 组有 \(k_i\) 个,分别为 \((1,a ...

  8. Solution -「SP 6779」GSS7

    \(\mathcal{Description}\)   给定一棵 \(n\) 个点的带点权树,\(q\) 次操作: 路径点权赋值. 询问路径最大子段和(可以为空).   \(n,q\le10^5\). ...

  9. Solution -「AGC 003D」「AT 2004」Anticube

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个数 \(a_i\),要求从中选出最多的数,满足任意两个数之积都不是完全立方数.   \(n\le10^5\) ...

  10. tomcat 配置https证书 ssl

    修改tomcat-conf-server.xml,原配置文件是 <Connector connectionTimeout="20000" port="8080&qu ...