luogu3563 逛公园
两遍 spfa 然后建立分层图拓扑排序 dp 一下。
写得很差劲。效率很低。
时间复杂度 \(\mathrm{O}(Tnk)\)。
参见这里秒懂。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
int T, n, m, k, p, cnt[2], hea[2][100005], dis[2][100005], uu, vv, ww, he[5100005], cn, dp[5100005];
int ind[5100005], f[100005][55];
bool vis[5100005];
queue<int> d;
struct Edge{
int too, nxt, val;
}edge[2][200005], edg[10200005];
void rn(int &x){
char ch=getchar();
x = 0;
while(ch<'0' || ch>'9') ch = getchar();
while(ch>='0' && ch<='9'){
x = x * 10 + ch - '0';
ch = getchar();
}
}
void add_edge(int rr, int fro, int too, int val){
edge[rr][++cnt[rr]].nxt = hea[rr][fro];
edge[rr][cnt[rr]].too = too;
edge[rr][cnt[rr]].val = val;
hea[rr][fro] = cnt[rr];
}
void add_edg(int fro, int too){
edg[++cn].nxt = he[fro];
edg[cn].too = too;
he[fro] = cn;
}
void init(){
rn(n); rn(m); rn(k); rn(p);
memset(he, 0, sizeof(he));
memset(dp, 0, sizeof(dp));
memset(hea, 0, sizeof(hea));
memset(vis, 0, sizeof(vis));
memset(ind, 0, sizeof(ind));
memset(dis, 0x3f, sizeof(dis));
dis[0][1] = dis[1][n] = cnt[0] = cnt[1] = cn = 0;
dp[1] = 1;
for(int i=1; i<=m; i++){
rn(uu); rn(vv); rn(ww);
add_edge(0, uu, vv, ww);
add_edge(1, vv, uu, ww);
}
int qwq=0;
for(int i=1; i<=n; i++)
for(int j=0; j<=k; j++)
f[i][j] = ++qwq;
}
void spfa(int rr){
d.push(rr?n:1);
vis[rr?n:1] = true;
while(!d.empty()){
int x=d.front();
d.pop();
vis[x] = false;
for(int i=hea[rr][x]; i; i=edge[rr][i].nxt){
int t=edge[rr][i].too;
if(dis[rr][t]>dis[rr][x]+edge[rr][i].val){
dis[rr][t] = dis[rr][x] + edge[rr][i].val;
if(!vis[t]){
vis[t] = true;
d.push(t);
}
}
}
}
}
void build(){
for(int i=1; i<=n; i++)
for(int j=0; j<=k; j++)
if(dis[0][i]+dis[1][i]+j<=dis[0][n]+k)
vis[f[i][j]] = true;
for(int i=1; i<=n; i++)
for(int j=0; j<=k; j++)
if(vis[f[i][j]])
for(int l=hea[0][i]; l; l=edge[0][l].nxt){
int t=edge[0][l].too, v=j+dis[0][i]+edge[0][l].val-dis[0][t];
if(v<=k && f[t][v]){
add_edg(f[i][j], f[t][v]);
ind[f[t][v]]++;
}
}
}
void topsort(){
for(int i=1; i<=n; i++)
for(int j=0; j<=k; j++)
if(vis[f[i][j]] && !ind[f[i][j]])
d.push(f[i][j]);
while(!d.empty()){
int x=d.front();
d.pop();
for(int i=he[x]; i; i=edg[i].nxt){
int t=edg[i].too;
ind[t]--;
if(ind[t]==0) d.push(t);
dp[t] = dp[t]+dp[x]>=p?dp[t]+dp[x]-p:dp[t]+dp[x];
}
}
}
int chk(){
for(int i=1; i<=f[n][k]; i++)
if(ind[i]!=0)
return -1;
int re=0;
for(int i=0; i<=k; i++)
re = re+dp[f[n][i]]>=p?re+dp[f[n][i]]-p:re+dp[f[n][i]];
return re;
}
int main(){
cin>>T;
while(T--){
init();
spfa(0);
spfa(1);
build();
topsort();
printf("%d\n", chk());
}
return 0;
}
luogu3563 逛公园的更多相关文章
- [vijos P1083] 小白逛公园
不知怎地竟有种错觉此题最近做过= =目测是类似的?那道题貌似是纯动归? 本来今晚想做两道题的,一道是本题,一道是P1653疯狂的方格取数或NOI08 Employee,看看现在的时间目测这个目标又达不 ...
- Bzoj 1756: Vijos1083 小白逛公园 线段树
1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1021 Solved: 326[Submit][Statu ...
- BZOJ 1756: Vijos1083 小白逛公园
题目 1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 856 Solved: 264[Submit][Sta ...
- JDOJ-P1260 VIJOS-P1083 小白逛公园
首先,在这里给大家推荐一个网站,https://neooj.com:8082,这是我母校的网站 言归正传,题目描述 VIJOS-P1083 小白逛公园 Time Limit: 1 Sec Memor ...
- [NOIP2017] 逛公园
[NOIP2017] 逛公园 题目大意: 给定一张图,询问长度 不超过1到n的最短路长度加k 的1到n的路径 有多少条. 数据范围: 点数\(n \le 10^5\) ,边数\(m \le 2*10^ ...
- [NOIp 2017]逛公园
Description 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N$号点是公园的出口,每条边有一个非负权值, 代表策策经 ...
- 【NOIP 2017】逛公园
Description 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要 ...
- 逛公园 [NOIP2017 D1T3] [记忆化搜索]
Description 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的 ...
- [luogu P3953] [noip2017 d1t3] 逛公园
[luogu P3953] [noip2017 d1t3] 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N ...
随机推荐
- bzoj 5018 [Snoi2017]英雄联盟
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=5018 题解 简单的dp 令dp[i][j]表示前i个英雄 总花费为j 最大能够得到的展示种数 ...
- KEIL软件仿真死在等待外部晶振起振
这是由于是Debug里面的设置有问题 主要是下面2项设置 Dialog DLL默认是DCM3.DLL Parameter默认是-pCM3 应改为 Dialog DLL默认是DARMSTM.DLL Pa ...
- RHEL 6.5----LVS(DR)
主机名 IP 所需软件 master eth0==>192.168.30.140(Nat) eth0:1==>192.168.17.130(Nat) ipvsadm node-1 et ...
- UVALive - 6428(扩展欧几里德)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=48388 前段时间偶然碰到的一道题,今天突然想到没把它记录下来. 比较不错的扩 ...
- Spring-bean(一)
配置形式:基于xml文件的方式:基于注解的方式 Bean的配置方式:通过全类名(反射),通过工厂方法(静态工厂方法&实例工厂方法),FactoryBean 依赖注入的方式:属性注入,构造器注入 ...
- poj2139 Six Degrees of Cowvin Bacon
思路: floyd 实现: #include <iostream> #include <cstdio> #include <cstring> #include &l ...
- 【学习笔记】深入理解js原型和闭包(12)——简介【作用域】
提到作用域,有一句话大家(有js开发经验者)可能比较熟悉:“javascript没有块级作用域”.所谓“块”,就是大括号“{}”中间的语句.例如if语句: 再比如for语句: 所以,我们在编写代码的时 ...
- viewport实现html页面动态缩放/meta viewport/viewport
页面默认缩放比例为1,最小宽度为375px,在小于375px出现水平滚动条的时候重新计算显示比例缩小界面, <!DOCTYPE html> <html lang="en&q ...
- html制作简单框架网页二 实现自己的影音驿站 操作步骤及源文件下载 (可播放mp4、avi、mpg、asx、swf各种文件的视频播放代码)
新增视频播放功能如下图: 左侧网页left.html代码如下: <meta charset="utf-8"> <body style="backgrou ...
- iOS html格式解析
使用TFHpple解析html https://github.com/topfunky/hpple 前期准备工作 引入静态库文件 添加库文件的 header search paths(注意,必须选中 ...