显然先求出最小生成树

如果删的是非树边就不用管,还是能取最小生成树

如果删的是树边就有非树边可以替代它

反向考虑,每条非树边可以替代最小生成树上一条路径的边

所以树剖加线段树,对每条非树边在树上更新对应的那一段的答案就行了

代码异常丑陋~~~

#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
struct edge{int x,y,i,w;}s[100010];
il bool cmp1(const edge&a,const edge&b){return a.w<b.w;}
il bool cmp2(const edge&a,const edge&b){return a.i<b.i;}
int Fa[50010];
il int hd(int x){return Fa[x]==x?x:Fa[x]=hd(Fa[x]);}
il vd Union(int a,int b){Fa[hd(a)]=hd(b);}
int dfn[50010],son[50010],siz[50010],fa[50010],top[50010],dep[50010];
int fir[50010],nxt[100010],dis[100010],id,num[100010];
il vd link(int a,int b,int c){
nxt[++id]=fir[a],fir[a]=id,dis[id]=b,num[id]=c;
nxt[++id]=fir[b],fir[b]=id,dis[id]=a,num[id]=c;
}
int NUM[100010];
il vd dfs(int x){
siz[x]=1;
for(int i=fir[x];i;i=nxt[i]){
if(fa[x]==dis[i])continue;
fa[dis[i]]=x;dep[dis[i]]=dep[x]+1;
NUM[num[i]]=dis[i];
dfs(dis[i]);
siz[x]+=siz[dis[i]];
if(siz[son[x]]<siz[dis[i]])son[x]=dis[i];
}
}
il vd dfs2(int x,int tp){
top[x]=tp;dfn[x]=++dfn[0];
if(son[x])dfs2(son[x],tp);
for(int i=fir[x];i;i=nxt[i])
if(dis[i]!=fa[x]&&dis[i]!=son[x])
dfs2(dis[i],dis[i]);
}
int lz[200010],ans[100010];
#define mid ((l+r)>>1)
il vd update(int x,int l,int r,const int&L,const int&R,const int&d){
if(L<=l&&r<=R){lz[x]=std::min(lz[x],d);return;}
if(L<=mid)update(x<<1,l,mid,L,R,d);
if(mid<R)update(x<<1|1,mid+1,r,L,R,d);
}
il vd down(int x,int l,int r){
if(l==r){ans[l]=lz[x];return;}
lz[x<<1]=std::min(lz[x<<1],lz[x]);
lz[x<<1|1]=std::min(lz[x<<1|1],lz[x]);
down(x<<1,l,mid),down(x<<1|1,mid+1,r);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("2238.in","r",stdin);
freopen("2238.out","w",stdout);
#endif
int n=gi(),m=gi();
for(int i=1;i<=m;++i)s[i].x=gi(),s[i].y=gi(),s[i].w=gi(),s[i].i=i;
std::sort(s+1,s+m+1,cmp1);
int q=gi();
for(int i=1;i<=n;++i)Fa[i]=i;
int t=1;ll ANS=0;
for(int i=1;i<n;++i){
while(t<=m&&hd(s[t].x)==hd(s[t].y))++t;
if(t>m){
while(q--)puts("Not connected");
return 0;
}
Union(s[t].x,s[t].y);
link(s[t].x,s[t].y,s[t].i);
ANS+=s[t].w;
}
std::sort(s+1,s+m+1,cmp2);
dfs(1),dfs2(1,1);
for(int i=1;i<=n*4;++i)lz[i]=1e9;
for(int i=1;i<=m;++i)
if(!NUM[i]){
int x=s[i].x,y=s[i].y;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]])update(1,1,n,dfn[top[x]],dfn[x],s[i].w),x=fa[top[x]];
else update(1,1,n,dfn[top[y]],dfn[y],s[i].w),y=fa[top[y]];
}
if(dep[x]>dep[y])std::swap(x,y);
update(1,1,n,dfn[x]+1,dfn[y],s[i].w);
}
down(1,1,n);
while(q--){
int x=gi();
if(NUM[x]){
if(ans[dfn[NUM[x]]]==1e9)puts("Not connected");
else printf("%lld\n",ANS-s[x].w+ans[dfn[NUM[x]]]);
}else printf("%lld\n",ANS);
}
return 0;
}

bzoj 2238 Mst的更多相关文章

  1. bzoj 2238 Mst —— 树剖+mn标记永久化

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2238 看了半天... 首先,想要知道每条边删除之后的替代中最小的那个: 反过来看,每条不在 ...

  2. bzoj 2238 Mst——树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2238 一条非树边可以对一条链的树边产生影响.注意是边,所以把边下放到点上,只要跳 top 时 ...

  3. BZOJ 2238: Mst DFS序+KDtree

    明明可以用二维数点来做啊,网上为什么都是树剖+线段树呢 ? code: #include <cstdio> #include <cstring> #include <al ...

  4. 8月清北学堂培训 Day5

    今天是杨思祺老师的讲授~ 最短路练习题: POJ 1125 Stockbroker Grapevine 有 N 个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径.现在有一个消息要由某个人开 ...

  5. DP&图论 DAY 5 下午

    DP&图论  DAY 5  下午 树链剖分  每一条边要么属于重链要么轻边 证明: https://www.cnblogs.com/sagitta/p/5660749.html 轻边重链都是交 ...

  6. 又是图论.jpg

    BZOJ 2200 道路和航线重讲ww: FJ 正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到 T 个城镇 (1 ≤ T ≤ 25000),编号为 1 到 T.这些城镇之间通过 R 条 ...

  7. 【bzoj2238】Mst(树链剖分+线段树)

    2238: Mst Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 465  Solved: 131[Submit][Status][Discuss] ...

  8. BZOJ练习记

    决定从头到尾干一波BZOJ!可能会写没几题就停下吧,但还是想学学新姿势啦. 1001. [BeiJing2006]狼抓兔子 即求 $(1, 1)$ 到 $(n, m)$ 的最小割.跑 dinic 即可 ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. 获取INET4与INET6的信息

    获取INET4与INET6的信息 参考书籍: 本人封装的源码: // // IPAddressInfo.h // YXNETWORK // // http://www.cnblogs.com/YouX ...

  2. [UI] Elastic Stack & scrollReveal.js

    Elastic Stack & scrollReveal.js Elastic Stack http://freebiesbug.com/code-stuff/elastistack-js-d ...

  3. [UI] 精美UI界面欣赏[12]

    精美UI界面欣赏[12]

  4. 铁乐学python_day29_模块与包学习4

    大部份内容摘自授课老师的博客http://www.cnblogs.com/Eva-J/ 编译python文件 编译python文件是为了提高加载模块的速度,强调强调强调:提高的是加载速度而绝非运行速度 ...

  5. November 19th 2016 Week 47th Saturday

    Nature didn't need an operation to be beautiful. It just was. 自然之美无需刻意而为,其本身即为美. Recently I saw seve ...

  6. log4j.properties的配置详解

    log4j.rootLogger=ERROR,A1log4j.appender.A1=org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout= ...

  7. Java8新特性 -- Lambda基础语法

    Lambda 表达式的基础语法: Java8引入了一个新的操作符 “->”  该操作符称为箭头操作符或Lambda操作符, 该操作符将Lambda表达式拆分为两部分: 左侧: Lambda表达式 ...

  8. 起床困难综合症 NOI_2014_D1T1

    这道题的正解其实没什么好说的,反而是部分分设计非常巧妙. 之所以要单开一篇是因为当时机房的部分同学刚学位运算,我拿这个题去讲想毒瘤大家一下,于是做了一个挺好看的课件. ppt -> pdf -& ...

  9. 【洛谷】【堆】P1168 中位数

    [题目描述:] 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1,3,5,……个数的中位数. ...

  10. 十五项指标衡量DevOps是否成功

    DevOps在你的组织内部运行的如何?如果你需要一些帮助来度量它的运行情况,我们已经准备了一个用于跟踪的关键DevOps指标的列表,这些度量可以帮助了解你的团队是如何随着时间的推移而运行的. 在团队内 ...