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 ...
随机推荐
- ES6中的Rest参数和默认参数
ES6中的Rest参数和默认参数 Rest参数 一个例子 编写一个函数, 用来判断, 某个字符串中, 是否其他的字符串, 如果第一参数以后的字符串, 都包含在第一参数中, 都包含在, 就返回true ...
- Eclipse Neon Java版本安装Java EE插件
Help→Install New Software 地址:Neon - http://download.eclipse.org/releases/neon/201703231000 选择 Web,X ...
- P1597 语句解析
题目背景 木有背景…… 题目描述 一串(<255)PASCAL语言,只有a,b,c 3个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,未赋值的变量值为0.输出a,b,c 最终的值. ...
- P2956 [USACO09OCT]机器人犁田The Robot Plow
题目描述 Farmer John has purchased a new robotic plow in order to relieve him from the drudgery of plowi ...
- oracle 触发器,序列,索引
oracle 触发器,序列,索引 --1,触发器 ----trigger /*触发器是一种特殊的存储过程,它与数据表紧密联系,用于保护表中的数据, 当一个定义了特定类型触发器的基表执行插入.修改或删除 ...
- php 生成饼状图,折线图,条形图 通用类 2
生成饼状图,折线图,条形图通用的php类,这里使用的是国外的 HighCharts,前台页面别忘了调用HighCahrt js HighCharts中文网站 http://www.hcharts. ...
- wkWebView 的一些问题
导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用.内存泄漏的 UIWebView.WKWebView 拥有60fps滚动刷 ...
- ubuntu服务器切换语言
如果在安装Ubuntu Server时选择了中文,在系统安装完毕后,默认是中文,在操作时经常会显示乱码,如果需要设置回英文,则修改/etc/default/locale,将 LANG="cn ...
- 洛谷P1724 东风谷早苗
题目描述 在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女.某一天,早苗终于入手了最新款的钢达姆模型.作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧(好吧,我自重).早苗的 ...
- About the iOS File System
两个维度: 1)是否给用户使用: 2)是否持久存储. During installation of a new app, the installer creates a number of conta ...