关键点的最小生成树?

关键点初始化为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. redis内存监控与回收

    Redis有自己的内存分配器,当key-value对象被移除时,Redis不会马上向操作系统释放其占用内存.redis之所以这样的设计有两个原因. OS可能会将释放内存交换到虚拟内存,但OS的虚拟内存 ...

  2. 基于mongoose 的增删改查操作

    无论是基于robomongo 的可视化工具,亦或是基于 mongoose 的函数工具,只要是对 mongodb 的操作,第一步都是开启数据库. 开启mongodb 数据库 进入mongod所在目录 执 ...

  3. absolute

    在需要用到小图标时,可以使用position:absolute,它具有消除float和位置不变特性.使用absolute可以浮现在同级元素的上方.用margin进行精确定位即可,也不必使用top,le ...

  4. 【BZOJ1859】【ZJOI2006】碗的叠放

    题目大意:给你n个碗,求如何堆叠,使得它们的总高度最低. 首先,我们枚举碗的叠放顺序. 假设我们已经堆好了前i个碗,那么在堆第i+1个碗时,我们要将第i+1个碗与前i个碗比较,确定第i+1个碗的离地高 ...

  5. WebAPI Post接收数据

    近日在写某开源商城的webapi接口,由于刚接触所以碰到某些问题,如post数据的接收啊等.在网上查询资料时给出了三种方式. 1.给多个数据对象封装成一个对象进行接收([frombody]标签只能用于 ...

  6. POJ 1102

    #include<iostream>// cheng da cai zi 11.14 using namespace std; int main() { int i; int j; int ...

  7. To be learned

    1.web性能测试工具:LoadRunner:2.web自动化测试工具:selenium QTP:3.安全性测试工具:AppScan4.缺陷管理工具:TestLink+Mantisbt5..抓包工具: ...

  8. MySQl资料链接

    原文:http://www.uml.org.cn/sjjm/sjjm-MySql.asp MySQl   MySQL高可用数据库内核深度优化的四重定制   MySQL数据表存储引擎类型及特性   My ...

  9. PL/SQL DEVELOPER数字超长显示了科学计数法

    问题: 最近在做项目中,ID使用了长整形,10进制数值大约长度17位,在pl/sql developer 上数值由科学计数法显示. 在查看时不是很方便,且数值进行了省略显示,不准确. 解决方法: 在t ...

  10. 快捷键&小技巧

    shift+鼠标滚轮:实现左右移动 alt+鼠标左键双击:打开属性 chrome中在F12下的Element中,可以先选中某一项,可以直接按住F2进行编辑 chrome中element的右下方我们可以 ...