题意

给定一个\(n\)个点、\(m\)条边的带权无向图,其中有\(s\)个点是加油站。每辆车都有一个油量上限\(b\),即每次行走距离不能超过\(b\),但在加油站可以补满。\(q\)次询问,每次给出\(x,y,b\),表示出发点是\(x\),终点是\(y\),油量上限为\(b\),且保证\(x\)点和\(y\)点都是加油站,请回答能否从\(x\)走到\(y\)。(\(2 \le s \le n \le 200000, 1 \le m \le 200000\))

分析

首先来分析如果只有一个询问,给出\(x\)点和\(y\)点问\(x\)是否能走到\(y\)。假设经过的非加油站的点集依次是\(p_1, p_2, \cdots, p_k\),那么考虑从\(p_1\)走到\(p_2\),假设有边\((p_1, p_2)\)(否则一定是从加油站走到\(p_2\)的),权值为\(w\)。如果我们从\(p_1\)走到最近的加油站(距离为\(d(p_1)\))加满油再回来,还剩的油为\(b-d(p_1)\),然后再走这条边。而如果直接从\(p_1\)走到\(p_2\),由于没有加油,此时在\(p_1\)的油量显然是\(\le b-d(p_1)\)的。显然加了油更优。

题解

根据分析,我们只需要按新赋值的边权w+d(u)+d(v)生成最小生成树来判断即可。对于询问,离线一下即可。

#include <bits/stdc++.h>
using namespace std;
const int N=200005, M=200005;
int ihead[N], cnt, n, m, s, p[N], h[N], c[N];
struct E {
int next, to, w;
}e[M<<1];
struct ED {
int x, y, d;
}ed[M];
struct QU {
int x, y, b, id;
}q[N];
void add(int x, int y, int w) {
e[++cnt]=(E){ihead[x], y, w}; ihead[x]=cnt;
e[++cnt]=(E){ihead[y], x, w}; ihead[y]=cnt;
}
int find(int x) {
return x==p[x]?x:p[x]=find(p[x]);
}
typedef pair<int, int> pii;
#define mkpii make_pair<int, int>
priority_queue<pii, vector<pii>, greater<pii> > qu;
int d[N], vis[N];
void dij() {
memset(d, 0x7f, sizeof(int)*(n+1));
for(int i=0; i<s; ++i) {
d[c[i]]=0;
qu.push(mkpii(0, c[i]));
}
while(qu.size()) {
int x=qu.top().second;
qu.pop();
if(vis[x]) {
continue;
}
vis[x]=1;
for(int i=ihead[x]; i; i=e[i].next) {
int y=e[i].to;
if(d[y]>d[x]+e[i].w) {
d[y]=d[x]+e[i].w;
qu.push(mkpii(d[y], y));
}
}
}
}
inline bool cmp1(const ED &a, const ED &b) {
return a.d<b.d;
}
inline bool cmp2(const QU &a, const QU &b) {
return a.b<b.b;
}
int ans[N];
int main() {
scanf("%d%d%d", &n, &s, &m);
for(int i=1; i<=n; ++i) {
p[i]=i;
h[i]=1;
}
for(int i=0; i<s; ++i) {
scanf("%d", &c[i]);
}
for(int i=0; i<m; ++i) {
scanf("%d%d%d", &ed[i].x, &ed[i].y, &ed[i].d);
add(ed[i].x, ed[i].y, ed[i].d);
}
dij();
for(int i=0; i<m; ++i) {
ed[i].d+=d[ed[i].x]+d[ed[i].y];
}
int Q;
scanf("%d", &Q);
for(int i=0; i<Q; ++i) {
scanf("%d%d%d", &q[i].x, &q[i].y, &q[i].b);
q[i].id=i;
}
sort(ed, ed+m, cmp1);
sort(q, q+Q, cmp2);
int now=0;
for(int i=0; i<Q; ++i) {
while(now<m && ed[now].d<=q[i].b) {
int fx=find(ed[now].x), fy=find(ed[now].y);
if(fx!=fy) {
if(h[fx]>h[fy]) {
swap(fx, fy);
}
p[fx]=fy;
h[fy]+=h[fy]==h[fx];
}
++now;
}
ans[q[i].id]=find(q[i].x)==find(q[i].y);
}
for(int i=0; i<Q; ++i) {
puts(ans[i]?"TAK":"NIE");
}
return 0;
}

【BZOJ】4144: [AMPPZ2014]Petrol的更多相关文章

  1. 【BZOJ】4147: [AMPPZ2014]Euclidean Nim

    [算法]博弈论+数论 [题意]给定n个石子,两人轮流操作,规则如下: 轮到先手操作时:若石子数<p添加p个石子,否则拿走p的倍数个石子.记为属性p. 轮到后手操作时:若石子数<q添加q个石 ...

  2. 【BZOJ】4152: [AMPPZ2014]The Captain【SLF优化Spfa】

    4152: [AMPPZ2014]The Captain Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2107  Solved: 820[Submi ...

  3. 【BZOJ】【4144】【AMPPZ2014】Petrol

    最短路+最小生成树+倍增 图论问题中综合性较强的一题= =(Orz vfk) 比较容易发现,关键的还是有加油站的这些点,其他点都是打酱油的. 也就是说我们重点是要求出 关键点之间的最短路. 这玩意…… ...

  4. BZOJ 4144: [AMPPZ2014]Petrol

    4144: [AMPPZ2014]Petrol Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 457  Solved: 170[Submit][Sta ...

  5. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  6. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  7. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  8. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  9. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

随机推荐

  1. 优先队列实现Huffman编码

    首先把所有的字符加入到优先队列,然后每次弹出两个结点,用这两个结点作为左右孩子,构造一个子树,子树的跟结点的权值为左右孩子的权值的和,然后将子树插入到优先队列,重复这个步骤,直到优先队列中只有一个结点 ...

  2. Git 修改源地址

    git remote set-url origin http://git.xxx.com/xxx/repo.git

  3. dell md3200i mdss (企业管理) 安装的那点事儿

    首先获取安装包,解压后如图: 我是在windows 机上安装,所以执行windows 文件夹下的可执行程序: 双击红箭头文件,进行安装,步骤截图如下: 出现最后这个界面,就说明安装成功,直接重启系统就 ...

  4. (一)Netty源码学习笔记之概念解读

    尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6121065.html  博主最近在做网络相关的项目,因此有契机学习netty,先 ...

  5. DataGridView里CheckBox实现全选控制

    1. checkbox点击事件 private void myStyleDataGridView1_CellClick(object sender, DataGridViewCellEventArgs ...

  6. netstat相关

    1. netstat基本参数: 参数 说明 输出 -a 列出所有连接. 列出 tcp, udp 和 unix 协议下所有套接字的所有连接.然而这些信息还不够详细,管理员往往需要查看某个协议或端口的具体 ...

  7. 女生学Web前端优势往往很明显

    学Web前端的女生不算少数,女生学习的成果也往往不比男生差,前端偏向设计.交互和产品方向,需要更加贴合用户,女生心思细腻,对页面细节把控更好,更具美感,对用户心理把握更准,这样的优势往往是男生所不具备 ...

  8. JS中的if和else的用法以及基础语法

    正常里的变量方式.var a = 10; 针对整数.var b = 3.14; 针对的小数点.var c = "你好":双引号或者单引号引起来的是定义字符串. 一.类型转换(强制转 ...

  9. 3dmax导出到blend或者vs中

    使用3dmax将模型导成obj格式的时候,可以导出材质或者不导出. 1.如果不导出,则按下图不勾选导出材质和创建材质库选项.这样生成的obj是可以直接再blend或者vs中打开的. 2.如果导出,不仅 ...

  10. Webbench性能测试

    1.下载安装:立即下载  官网:http://home.tiscali.cz/~cz210552/webbench.html 2.解压缩:tar -zxvf webbench-1.5.tar.gz 3 ...