BZOJ4144 [AMPPZ2014]Petrol 【最短路 + 最小生成树】
题目链接
题解
这题好妙啊,,orz
假设我们在一个非加油站点,那么我们一定是从加油站过来的,我们剩余的油至少要减去这段距离
如果我们在一个非加油站点,如果我们到达不了任意加油站点,我们一定废了
那么我们在一个非加油站点,就一定可以到达最近的加油站,而由于我们剩余的油是要减去到加油站距离的,所以我们剩余的油一定是\(b - d\),\(d\)表示到达最近加油站的距离。假如我们没有那么多油,我们一定可以开过去再回来,就有了
因此,我们在任意一个点的油量确定,两点之间可以直达,当且仅当
①两点间有边
②\(w + d[u] + d[v] \le b\)
因此可以以此为新边权跑最小生成树,同时离线回答询问
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 200005,maxm = 400005,INF = 2000000026;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int n,s,m,Q,c[maxn];
int h[maxn],ne;
struct EDGE{int to,nxt,w;}ed[maxm];
inline void build(int u,int v,int w){
ed[++ne] = (EDGE){v,h[u],w}; h[u] = ne;
ed[++ne] = (EDGE){u,h[v],w}; h[v] = ne;
}
struct edge{int a,b,w;}e[maxn];
inline bool operator < (const edge& a,const edge& b){
return a.w < b.w;
}
struct Que{int u,v,b,id;}q[maxn];
inline bool operator < (const Que& a,const Que& b){
return a.b < b.b;
}
priority_queue<cp,vector<cp>,greater<cp> > qu;
int vis[maxn],d[maxn];
void dijkstra(){
for (int i = 1; i <= n; i++) d[i] = INF;
for (int i = 1; i <= s; i++)
d[c[i]] = 0,qu.push(mp(0,c[i]));
int u;
while (!qu.empty()){
u = qu.top().second; qu.pop();
if (vis[u]) continue;
vis[u] = true;
Redge(u) if (!vis[to = ed[k].to] && d[u] + ed[k].w < d[to]){
d[to] = d[u] + ed[k].w;
qu.push(mp(d[to],to));
}
}
}
int ans[maxn],pre[maxn];
inline int find(int u){return u == pre[u] ? u : pre[u] = find(pre[u]);}
void kruskal(){
REP(i,m) e[i].w = e[i].w + d[e[i].a] + d[e[i].b];
sort(e + 1,e + 1 + m);
int t = 1,fa,fb;
REP(i,n) pre[i] = i;
for (int i = 1; i <= m; i++){
while (t <= Q && e[i].w > q[t].b){
ans[q[t].id] = (find(q[t].u) == find(q[t].v));
t++;
}
fa = find(e[i].a); fb = find(e[i].b);
if (fa != fb) pre[fb] = fa;
}
while (t <= Q){
ans[q[t].id] = (find(q[t].u) == find(q[t].v));
t++;
}
}
int main(){
n = read(); s = read(); m = read();
REP(i,s) c[i] = read();
REP(i,m){
e[i].a = read(); e[i].b = read(); e[i].w = read();
build(e[i].a,e[i].b,e[i].w);
}
Q = read();
REP(i,Q) q[i].u = read(),q[i].v = read(),q[i].b = read(),q[i].id = i;
sort(q + 1,q + 1 + Q);
dijkstra();
kruskal();
REP(i,Q) puts(ans[i] ? "TAK" : "NIE");
return 0;
}
BZOJ4144 [AMPPZ2014]Petrol 【最短路 + 最小生成树】的更多相关文章
- BZOJ4144: [AMPPZ2014]Petrol(最短路 最小生成树)
题意 题目链接 Sol 做的时候忘记写题解了 可以参考这位大爷 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...
- 【BZOJ4144】[AMPPZ2014]Petrol 最短路+离线+最小生成树
[BZOJ4144][AMPPZ2014]Petrol Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油 ...
- [BZOJ4144][AMPPZ2014]Petrol[多源最短路+MST]
题意 题目链接 分析 假设在 \(a \rightarrow b\) 的最短路径中出现了一个点 \(x\) 满足到 \(x\) 最近的点是 \(c\) ,那么我们完全可以从 \(a\) 直接走到 \( ...
- bzoj4144 [AMPPZ2014]Petrol
link 题意: 给一个n个点m条边的带权无向图,其中k个点是加油站,每个加油站可以加满油,但不能超过车的油量上限.有q个询问,每次给出x,y,b,保证x,y都是加油站,问一辆油量上限为b的车从x出发 ...
- 4144: [AMPPZ2014]Petrol (多源最短路+最小生成树+启发式合并)
4144: [AMPPZ2014]Petrol Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 752 Solved: 298[Submit][Sta ...
- BZOJ 4144: [AMPPZ2014]Petrol
4144: [AMPPZ2014]Petrol Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 457 Solved: 170[Submit][Sta ...
- Day3 最短路 最小生成树 拓扑排序
Day3 最短路 最小生成树 拓扑排序 (一)最短路 一.多源最短路 从任意点出发到任意点的最短路 1. Floyd \(O(n^3)\) for(int k=1;k<=n;k++) for(i ...
- 【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)
Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是 ...
- BZOJ.4144.[AMPPZ2014]Petrol(Kruskal重构树)
BZOJ 看别人代码的时候发现哪一步都很眼熟,突然想起来,就在四个月前我好像看过还给别人讲过?mmp=v= 果然不写写就是容易忘.写了好歹忘了的时候还能复习呢(虽然和看别人的好像也没多少差别?). 首 ...
随机推荐
- Python3.6+selenium3.8+Firefox5.7 环境搭建
大家好,我是阿哲,本人是从php转岗过来学习测试的一名小菜! 在学习selenium过程中,发现运行selenium有很多的问题. 我们在利用pip install selenium 安装的最新版后, ...
- 【system.number】使用说明
对象:system.number 说明:提供一系列针对数值类型的操作 目录: 方法 返回 说明 system.number.isNumber( number ) [True | False] 检测是否 ...
- DP动态规划练习
先来看一下经典的背包问题吧 http://www.cnblogs.com/Kalix/p/7617856.html 01背包问题 https://www.cnblogs.com/Kalix/p/76 ...
- [CH0304]IncDec Sequence
和NOIP2018DAY1T1类似的题目,但思维难度高多了. 这题既可以抬高路面,也可以降低路面,而且目标平面不确定,就难起来了. 但是两道题的基本思路几乎一样,同样我们将 2~n 的高度差分,1之所 ...
- 聊聊、dubbo 找不到 dubbo.xsd 报错
平常在用 Dubbo 的时候,创建 xml 会提示 http://code.alibabatech.com/schema/dubbo/dubbo.xsd 找不到. 大家可以去 https://gith ...
- Python3 条件与循环
1.条件控制 下面是一个简单的条件控制语句 s=input('Please input a str: ') if s=='python': print('I love python!') elif s ...
- 使用Response.Write实现在页面的生命周期中前后台的交互
Response.Write()方法非常的常见,也很普通,就是向http output中输出一string.其输出的内容位于页面的最顶端,常用来实现显示一些页面消息框等逻辑. 一般来说,在页面的整个生 ...
- Java中String类
String类 一.String类的用途 对字符串的存储与操作,即包含多个字符的字符数据,这个String类提供了数值不可改变的字符串. String类为什么不可改变的字符串,因为String类是fa ...
- POJ 1696 Space Ant(凸包变形)
Description The most exciting space discovery occurred at the end of the 20th century. In 1999, scie ...
- Special Offer! Super Price 999 Bourles!
Description Polycarpus is an amateur businessman. Recently he was surprised to find out that the mar ...