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 ...
随机推荐
- HDU - 6063 RXD and math
Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6063 打表发现规律是n^k #include <iostream> #inc ...
- UVa 1220 Party at Hali-Bula 晚会
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #i ...
- bash 变量传递方法
###1.sh ##(该sh 目的是 将变量env传入env.sh, 同时让env.sh在当前事物生效,最后执行env.sh 定义的变量envs) export ENV=prepareecho ...
- ES--在windows上快速安装
环境准备 java环境部署: Java下载路径:http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a ...
- servlet基础概念
一.servlet是什么? 运行在Web服务器上(如:tomcat),作为浏览器请求与数据库或其他应用程序之间的中间层 二.servlet主要任务: 1.读取浏览器发送的显式数据(如:html表单)隐 ...
- RedHat改yum源免费使用CentOS源
linux默认是安装了yum软件的,但是由于激活认证的原因让redhat无法直接进行yum安装一些软件 如果我们需要在redhat下直接yum安装软件,我们只用把yum的源修改成CentOS的就好了, ...
- re正则表达式讲解—初步认识
# f = open(r"C:\Users\LENOVO\Desktop\模特.txt",'r') # 1.常规提取文档内容方法 # contacts = [] # for i i ...
- Web服务器安全设置
Web服务器安全方面一直重视程度不够,是各种网站经常被黑的主要原因.下面笔者总结了一下关于怎样保证Web服务器安全的措施,希望能给那些服务器尚存在漏洞的用户提供一些帮助. 本文主要以Windows s ...
- qt sql多重条件查询简便方法
转载请注明出处:http://www.cnblogs.com/dachen408/p/7457312.html 程序设计过程中,经常要涉及到查询,并且有很多条件,且条件可为空,如果逐个判断,会有很多情 ...
- Jenkins邮件扩展插件Email Extension Plugin配置使用
1.在管理插件中搜索并安装邮件扩展插件Email Extension Plugin: 2.在任务中增加构建后操作步骤,选择Editable Email Notification; 3.在高级中Add ...