关键点的最小生成树?

关键点初始化为0,跑多源最短路,然后重构整个图,用Kruskal跑最小生成树

然后跑树链剖分在线回答询问

对树上每个点维护到链顶的最大值,结合线段树可以做到\(\Theta(n \log n)\)的复杂度

#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
using namespace std; const int MAXN=1<<18; int n,m,s,np,root;
int x[MAXN],y[MAXN],z[MAXN],h[MAXN],c[MAXN],f[MAXN];
int blg[MAXN],hp[MAXN],id[MAXN],ln[MAXN],fa[MAXN],sn[MAXN];
int dep[MAXN],ren[MAXN],siz[MAXN],top[MAXN],val[MAXN],lis[MAXN];
int tree[MAXN<<1];
struct rpg{
int li,nx,ln;
}a[MAXN<<1];
struct lint{
int ls,nx,ln;
}line[MAXN]; inline int read()
{
int x=0;char ch=getchar();
while(ch<'0'||'9'<ch) ch=getchar();
while('0'<=ch&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x;
} void add(int ls,int nx,int ln)
{
a[++np]=(rpg){h[ls],nx,ln};h[ls]=np;
a[++np]=(rpg){h[nx],ls,ln};h[nx]=np;
} void init()
{
n=read(),s=read(),m=read();
for(int i=1;i<=s;++i) c[i]=read();
for(int i=1;i<=m;++i) x[i]=read(),y[i]=read(),z[i]=read(),add(x[i],y[i],z[i]);
return;
} void up(int x)
{
for(int i=x,j=i>>1;j;i=j,j>>=1){
if(ln[hp[i]]<ln[hp[j]]) swap(hp[i],hp[j]),swap(id[hp[i]],id[hp[j]]);
else break;
}return;
} void ins(int x)
{
hp[++hp[0]]=x;
id[x]=hp[0];
up(hp[0]);
return;
} void pop()
{
id[hp[1]]=0;
hp[1]=hp[hp[0]--];
id[hp[1]]=1;
for(int i=1,j=2;j<=hp[0];i=j,j<<=1){
if(j<hp[0]&&ln[hp[j+1]]<ln[hp[j]]) ++j;
if(ln[hp[i]]>ln[hp[j]]) swap(hp[i],hp[j]),swap(id[hp[i]],id[hp[j]]);
else break;
}return;
} void SPkstra()
{
memset(ln,0x7f,sizeof(ln));
for(int i=1;i<=s;++i) ln[c[i]]=0,ins(c[i]),blg[c[i]]=c[i];
while(hp[0]){
int nw=hp[1];pop();
for(int i=h[nw];i;i=a[i].li){
if(ln[a[i].nx]>ln[nw]+a[i].ln){
ln[a[i].nx]=ln[nw]+a[i].ln;
blg[a[i].nx]=blg[nw];
if(id[a[i].nx]) up(id[a[i].nx]);
else ins(a[i].nx);
}
}
}return;
} bool cmp(lint a,lint b){return a.ln<b.ln;}
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
void un(int a,int b){int fa=find(a),fb=find(b);if(fa!=fb) f[fa]=fb;} void Krusbuild()
{
np=0;
memset(a,0,sizeof(a));
memset(h,0,sizeof(h));
for(int i=1;i<=m;++i) line[i]=(lint){blg[x[i]],blg[y[i]],ln[x[i]]+ln[y[i]]+z[i]};
for(int i=1;i<=n;++i) f[i]=i;
sort(line+1,line+m+1,cmp);
int ct=0;
for(int i=1;i<=m;++i){
if(find(line[i].ls)!=find(line[i].nx)){
un(line[i].ls,line[i].nx);
add(line[i].ls,line[i].nx,line[i].ln);
++ct;
}if(ct==s-1) break;
}return;
} void dfs1(int x,int f,int tp)
{
fa[x]=f;
dep[x]=tp;
siz[x]=1;
for(int i=h[x];i;i=a[i].li){
if(a[i].nx==f) continue;
dfs1(a[i].nx,x,tp+1);
val[a[i].nx]=a[i].ln;
siz[x]+=siz[a[i].nx];
if(siz[sn[x]]<siz[a[i].nx]) sn[x]=a[i].nx;
}return;
} void dfs2(int x,int tpx,int v)
{
id[x]=++id[0];
ren[id[x]]=val[x];
lis[x]=v;
top[x]=tpx;
if(!sn[x]) return;
dfs2(sn[x],tpx,max(v,val[sn[x]]));
for(int i=h[x];i;i=a[i].li){
if(a[i].nx==fa[x]||a[i].nx==sn[x]) continue;
dfs2(a[i].nx,a[i].nx,a[i].ln);
}return;
} void build(int k,int l,int r)
{
if(l==r){
tree[k]=ren[l];
return;
}int i=k<<1,mid=l+r>>1;
build(i,l,mid);build(i|1,mid+1,r);
tree[k]=max(tree[i],tree[i|1]);
return;
} void treecut()
{
id[0]=0;
for(int i=1;i<=s;++i) if(!dep[c[i]]) dfs1(c[i],c[i],1);
for(int i=1;i<=s;++i) if(!id[c[i]]) dfs2(c[i],c[i],0);
build(1,1,s);
return;
} int cask(int k,int l,int r,int le,int ri)
{
if(le<=l&&r<=ri) return tree[k];
int i=k<<1,mid=l+r>>1,maxn=0;
if(le<=mid) maxn=max(maxn,cask(i,l,mid,le,ri));
if(mid<ri) maxn=max(maxn,cask(i|1,mid+1,r,le,ri));
return maxn;
} int qmax(int x,int y)
{
int maxn=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
maxn=max(maxn,lis[x]);
x=fa[top[x]];
}if(dep[x]>dep[y]) swap(x,y);
if(id[x]+1<=id[y]) maxn=max(maxn,cask(1,1,s,id[x]+1,id[y]));
return maxn;
} void solve()
{
m=read();
while(m--){
int x=read(),y=read(),d=read();
if(find(x)!=find(y)||qmax(x,y)>d) puts("NIE");
else puts("TAK");
}return;
} int main()
{
init();
SPkstra();
Krusbuild();
treecut();
solve();
return 0;
}

[AMPPZ2014]Petrol的更多相关文章

  1. BZOJ 4144: [AMPPZ2014]Petrol

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

  2. 4144: [AMPPZ2014]Petrol (多源最短路+最小生成树+启发式合并)

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

  3. 【BZOJ4144】[AMPPZ2014]Petrol 最短路+离线+最小生成树

    [BZOJ4144][AMPPZ2014]Petrol Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油 ...

  4. 【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)

    Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是 ...

  5. 【BZOJ】4144: [AMPPZ2014]Petrol

    题意 给定一个\(n\)个点.\(m\)条边的带权无向图,其中有\(s\)个点是加油站.每辆车都有一个油量上限\(b\),即每次行走距离不能超过\(b\),但在加油站可以补满.\(q\)次询问,每次给 ...

  6. BZOJ.4144.[AMPPZ2014]Petrol(Kruskal重构树)

    BZOJ 看别人代码的时候发现哪一步都很眼熟,突然想起来,就在四个月前我好像看过还给别人讲过?mmp=v= 果然不写写就是容易忘.写了好歹忘了的时候还能复习呢(虽然和看别人的好像也没多少差别?). 首 ...

  7. [BZOJ4144][AMPPZ2014]Petrol[多源最短路+MST]

    题意 题目链接 分析 假设在 \(a \rightarrow b\) 的最短路径中出现了一个点 \(x\) 满足到 \(x\) 最近的点是 \(c\) ,那么我们完全可以从 \(a\) 直接走到 \( ...

  8. BZOJ4144: [AMPPZ2014]Petrol(最短路 最小生成树)

    题意 题目链接 Sol 做的时候忘记写题解了 可以参考这位大爷 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...

  9. bzoj4144 [AMPPZ2014]Petrol

    link 题意: 给一个n个点m条边的带权无向图,其中k个点是加油站,每个加油站可以加满油,但不能超过车的油量上限.有q个询问,每次给出x,y,b,保证x,y都是加油站,问一辆油量上限为b的车从x出发 ...

随机推荐

  1. 图片后门恶意捆绑工具FackImageexploer

    本文作者:夜莺 今天向大家提个醒,最近有一款工具名叫FackImageexploer,该工具能够将恶意的.bat和.exe程序与图片绑定在一起,假若受害者点击了图片,就会反弹个shell给不法分子,如 ...

  2. SpringBoot入门之分散配置

    springboot默认支持两种格式的配置文件:.properties和.yml.其中.properties是属性文件,也是最常用的一种:.yml是yaml格式的文件,yaml是一种简洁的标记语言.例 ...

  3. Flask从入门到精通之链接的使用

    在Web开发中,任何具有多个路由的程序都需要可以连接不同页面的链接,例如导航条. 在模板中直接编写简单路由的URL 链接不难,但对于包含可变部分的动态路由,在模板中构建正确的URL 就很困难.而且,直 ...

  4. vue 学前班001(基础概念)

    1  学习目标 通过这一节,你会学会: 1.目前前端技术使用的趋势 2.什么是MVVM 3.Vue.js的两大核心 4.Vue.js的适用场景  诞生背景 近几年来,得益于手机设备的普及和性能的提升, ...

  5. pythonweb框架Flask学习笔记01-ubuntu18.04下安装Flask

    Flask 依赖两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 工具集 由于各个项目工程之间可能存在python库版本的差异 为了防止库版本差异对项目开发产生的影响,使用virtu ...

  6. Vue环境搭建及node安装过程整理

    一.nodejs的安装 Node.js安装包及源码下载地址为:https://nodejs.org/en/download/. 我们可以根据不同平台系统选择你需要的Node.js安装包.Node.js ...

  7. POJ 2376

    #include<iostream>//by chengdacaizi. #include<stdio.h> #define MAXN 25005 using namespac ...

  8. Distributed PostgreSQL on a Google Spanner Architecture – Query Layer

    转自:https://blog.yugabyte.com/distributed-postgresql-on-a-google-spanner-architecture-query-layer/ Ou ...

  9. Python 1行代码实现文本分类(实战笔记),含代码详细说明及运行结果

    Python 1行代码实现文本分类(实战笔记),含代码详细说明及运行结果 一.详细说明及代码 tc.py =============================================== ...

  10. ERROR:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing 解决方案

    我尝试的过程如下 1. 时间没有同步 用date命令看一下每个机器 如果时间差距大 说明确实有问题 ** 配置时间服务器             ** 检查时区                 $ d ...