[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 ...
随机推荐
- 从零自学Java-3.在程序中存储和修改变量信息
1.创建变量: 2.使用不同类型的变量: 3.在变量中存储值: 4.在数学表达式中使用变量: 5.把一个变量的值赋给另一个变量: 6.递增/递减变量的值. 程序Variable:使用不同类型的变量并赋 ...
- leveldb源码分析--SSTable之TableBuilder
上一篇文章讲述了SSTable的格式以后,本文结合源码解析SSTable是如何生成的. void TableBuilder::Add(const Slice& key, const Slice ...
- 使用 Azure Active Directory 管理 Azure 中的 HPC Pack 群集
Microsoft HPC Pack 2016 支持在 Azure 中部署 HPC Pack 群集的管理员将其与 Azure Active Directory (Azure AD) 集成. 请按照本文 ...
- 转:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek
0.参考文献 Table Scan, Index Scan, Index Seek SQL SERVER – Index Seek vs. Index Scan – Diffefence and Us ...
- Linux 中 FQDN 查询及设置
FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称 其实就是标注一个主机的完整域名.比如我的域名为 ifrom.top 那么它的邮件服务器的主机 ...
- 再谈全局网HBase八大应用场景
摘要: HBase可以说是一个数据库,也可以说是一个存储.拥有双重属性的HBase天生就具备广阔的应用场景.在2.0中,引入了OffHeap降低了延迟,可以满足在线的需求.引入MOB,可以存储10M左 ...
- 2018.09.01 09:22 Exodus
Be careful when writing in the blog garden. Sometimes you accidentally write something wrong, and yo ...
- 百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。
1.POI爬取方法说明 1.1AK申请 登录百度账号,在百度地图开发者平台的API控制台申请一个服务端的ak,主要用到的是Place API.检校方式可设置成IP白名单,IP直接设置成了0.0.0.0 ...
- BZOJ5415:[NOI2018]归程(可持久化并查集,最短路)
Description Input Output Sample Input1 14 31 2 50 12 3 100 23 4 50 15 0 23 02 14 13 13 2 Sample Outp ...
- css里颜色的那些事儿(合法颜色值)
css中主要有六种方法指定颜色: 1.十六进制颜色 2.RGB颜色 3.RGBA颜色 4.HSL色彩 5.HSLA颜色 6.预定义/跨浏览器的颜色名称 前三种是我们最常见的,也是用的最多的,而后三种对 ...