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 ...
随机推荐
- AIX系统常用命令
netstat -an | grep 9090 可以看到该端口正被监听,但却不知道是哪个进程占用了该端口 1. netstat -Aan|grep 端口号找到该端口连接对应的PCB/ADDR和连接的 ...
- 485 Max Consecutive Ones 最大连续1的个数
给定一个二进制数组, 计算其中最大连续1的个数.示例 1:输入: [1,1,0,1,1,1]输出: 3解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.注意: 输入的数组只包 ...
- Python实现决策树C4.5算法
为什么要改进成C4.5算法 原理 C4.5算法是在ID3算法上的一种改进,它与ID3算法最大的区别就是特征选择上有所不同,一个是基于信息增益比,一个是基于信息增益. 之所以这样做是因为信息增益倾向于选 ...
- js数据类型之判断
js有几种类型,具体是:字符串(String).数字(Number).布尔(Boolean).数组(Array).对象(Object).空(Null).未定义(Undefined). js提供了typ ...
- laravel oauth2.0 文件上传报错
报错信息: "message": "Invalid stream or file provided for UploadedFile", " ...
- flask搭建
1.定义路由app.py from flask import Flask, request from flask import Blueprint app = Flask(__name__) test ...
- python工具之日志记录
''' 写日志类 日志存放目录为当前应用程序的目录下的log目录中 日志产生规则:每小时产生一个文件 write by :wujf 2017-02-24 ''' import sys import o ...
- ES-Apache Lucene
前言 在介绍Lucene之前,我们来了解相关的历史. 有必要了解的Apache Apache软件基金会(也就是Apache Software Foundation,简称为ASF)是专门为运作一个开源软 ...
- 微信小程序 开放能力学习
1. 用户信息小程序登录使用微信的个人信息快速搭建用户体系,登录逻辑:小程序向微信获取code 给服务端生成用户. 说明1. 小程序端调用 wx.login() 获取临时登录凭证 code,并传到服务 ...
- 批量部署Hadoop集群环境(1)
批量部署Hadoop集群环境(1) 1. 项目简介: 前言:云火的一塌糊涂,加上自大二就跟随一位教授做大数据项目,所以很早就产生了兴趣,随着知识的积累,虚拟机已经不能满足了,这次在服务器上以生产环境来 ...