[BZOJ4144][AMPPZ2014]Petrol[多源最短路+MST]
题意
分析
- 由于起点和终点都是加油站,所以我们可以把整个问题看成是从加油站到加油站。
- 考虑一个暴力的做法,用最短路在 \(O(n^2\log n)\) 的时间内求出加油站两两之间的最短路。于是问题变成了最小瓶颈路。把所有询问离线跑最小生成树,判断连通性即可。
- 考虑优化刚才的建边。假设 \(a,b,c\) 都是加油站。在 \(a \rightarrow b\) 的最短路径中出现了一个点 \(x\) 满足到 \(x\) 最近的点是 \(c\) ,那么我们完全可以从 \(a\) 直接走到 \(c\),而 \(c\) 又是当前最近的能够到达的加油站,所以这样走一定会更优。
- 将加油站全部放入优先队列跑最短路,求出距离每个点最近的加油站 \({from}_x\) 和 \(x\) 到 \(from_x\) 的距离 \(dis_x\) 。
- 枚举每条边如果两端的 \(from\) 不同则可以建立路径 \({from}_u \rightarrow {from}_v\), 距离 \({dis}_u+{dis}_v+w_e\)。然后再用 MST 求解即可。
- 总时间复杂度为 \(O(n\log n)\)。
代码
#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].lst,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
const int N=2e5 + 7;
const LL inf=1e13;
int n,m,s,edc,q;
int head[N],vis[N],from[N],par[N],ans[N];
LL dis[N];
struct qry{
int u,v,id;LL d;
bool operator <(const qry &rhs)const{
return d<rhs.d;
}
}A[N],B[N];
struct edge{
int lst,to,c;
edge(){}edge(int lst,int to,int c):lst(lst),to(to),c(c){}
}e[N*4];
void Add(int a,int b,int c){
e[++edc]=edge(head[a],b,c),head[a]=edc;
e[++edc]=edge(head[b],a,c),head[b]=edc;
}
struct data{
int u;LL dis;
data(){}data(int u,LL dis):u(u),dis(dis){}
bool operator <(const data &rhs)const{
return rhs.dis<dis;
}
};
priority_queue<data>Q;
int getpar(int a){
return par[a]==a?a:par[a]=getpar(par[a]);
}
int main(){
n=gi(),s=gi(),m=gi();
rep(i,1,n) par[i]=i;
rep(i,1,n) dis[i]=inf;
rep(i,1,s) {
int x=gi();
dis[x]=0;from[x]=x;
Q.push(data(x,dis[x]));
}
rep(i,1,m) {
A[i].u=gi(),A[i].v=gi(),A[i].d=gi();
Add(A[i].u,A[i].v,A[i].d);
}
while(!Q.empty()){
int u=Q.top().u;Q.pop();
if(vis[u]) continue;vis[u]=1;
go(u)if(dis[u]+e[i].c<dis[v]){
dis[v]=dis[u]+e[i].c;
from[v]=from[u];
Q.push(data(v,dis[v]));
}
}
int cnt=0;
rep(i,1,m){
if(from[A[i].u]==from[A[i].v]) continue;
A[++cnt]=(qry){from[A[i].u],from[A[i].v],0,dis[A[i].u]+dis[A[i].v]+A[i].d};
}
q=gi();
rep(i,1,q)
B[i].u=gi(),B[i].v=gi(),B[i].d=gi(),B[i].id=i;
sort(A+1,A+1+cnt);
sort(B+1,B+1+q);
A[cnt+1].d=inf;
int now=1;
rep(i,1,q){
for(;now<=cnt&&A[now].d<=B[i].d;++now){
int x=A[now].u,y=A[now].v;
par[getpar(x)]=getpar(y);
}
ans[B[i].id]=getpar(B[i].u)==getpar(B[i].v);
}
rep(i,1,q) puts(ans[i]?"TAK":"NIE");
return 0;
}
[BZOJ4144][AMPPZ2014]Petrol[多源最短路+MST]的更多相关文章
- 4144: [AMPPZ2014]Petrol (多源最短路+最小生成树+启发式合并)
4144: [AMPPZ2014]Petrol Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 752 Solved: 298[Submit][Sta ...
- bzoj4144 [AMPPZ2014]Petrol
link 题意: 给一个n个点m条边的带权无向图,其中k个点是加油站,每个加油站可以加满油,但不能超过车的油量上限.有q个询问,每次给出x,y,b,保证x,y都是加油站,问一辆油量上限为b的车从x出发 ...
- BZOJ4144 [AMPPZ2014]Petrol 【最短路 + 最小生成树】
题目链接 BZOJ4144 题解 这题好妙啊,,orz 假设我们在一个非加油站点,那么我们一定是从加油站过来的,我们剩余的油至少要减去这段距离 如果我们在一个非加油站点,如果我们到达不了任意加油站点, ...
- 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(最短路+最小生成树+并查集)
Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是 ...
- BZOJ 4144: [AMPPZ2014]Petrol
4144: [AMPPZ2014]Petrol Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 457 Solved: 170[Submit][Sta ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
随机推荐
- sql Server 查询方法的优化
在使用SQL语句查询数据库记录时,如果要查询相同的内容,有着不同的多种方法. 仍然,尽管使用多种方法可以得到相同的结果,但是,如果您使用不同的方法,在执行效益上是截然不同的.因此,我们得仔细考虑,如果 ...
- 转:基于InstallShield2013LimitedEdition的安装包制作
InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序) InstallShield Limited Edit ...
- Linux parted命令详解
parted常见命令参数 Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...] Apply COMMANDs with PAR ...
- 【转】Java十大常用框架介绍(spring系+dubbo+RabbitMQ+Ehcache+redis)
一.SpringMVC Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动 ...
- Linux下搭建lnmp环境
前提:假设阅读本文的读者已经拥有基本的linux使用技巧,能够解决系统安装问题,以及软件安装的技巧. 注意: 本文所涉及的主要安装包(需要下载使用的)安装包,在本文最后会给出百度云盘链接,需要使用的, ...
- 阿里八八Alpha阶段Scrum(5/12)
今日进度 叶文滔: 与添加日程界面完成界面对接. 问题困难:发现浮动按钮拖曳存在BUG,无法正确判断拖曳与点击事件,已经修复为普通悬浮按钮. 林炜鸿: 绘制完成添加日程界面. 李嘉群: 1.尝试有关用 ...
- Python接口自动化--SSL 3
官方文档参考地址: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings 针对SSL Warnings,u ...
- SASS对css的管理
一.SASS简介 SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一般 ...
- SAP客户端 测试机、开发机、生产机
SAP客户端 测试机.开发机.生产机 客户端(即Client),是SAP组织架构里最高层的组织单元,所有数据,包括静态数据(科目.客户.供应商.物料.资产等).业务数据(采购订单.销售订单. ...
- c++ ActiveX基础1:使用VS2010创建MFC ActiveX工程项目
1.ActiveX的基本概念 ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行.这个容器包括WEB网页,应用程序窗体等... Activ ...