传送门
树链剖分菜题。
题意简述:给一个无向图,边有边权,每次询问删一条边(对后面的询问无影响)之后的最小生成树。
思路:
先跑一次 k r u s k a l kruskal kruskal并把跑出来的最小生成树给链剖了。
然后考虑如果没有删掉树边答案不变,如果删掉一条能够接上的就只有覆盖了这条边的路径,因此对于每条非树边都用来更新一次树边的信息, O ( 1 ) O(1) O(1)处理询问即可。
注意要转边为点
代码:
#include<bits/stdc++.h>
#define ri register int
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
#define fi first
#define se second
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
const int N=1e5+5,M=1e5+5,inf=0x3f3f3f3f;
bool vis[M];
int n,m,fa[N],siz[N],dep[N],top[N],hson[N],ban[N],pred[N],tot=0,num[N],sum=0;
struct edge{
int u,v,w,id;}g[M];
vector<int>e[N];
inline int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);}
void dfs1(int p){
siz[p]=