社区讨论
Kruskal重构树求调
学术版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mih2bdw0
- 此快照首次捕获于
- 2025/11/27 14:38 3 个月前
- 此快照最后确认于
- 2025/11/27 14:40 3 个月前
树剖lca与Kruskal都过了,但是重构树运行dfs1时一直卡住
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 15;
inline int read() {
int x = 0, f = 0;
char c = getchar();
while (!isdigit(c)) {
f |= c == '-';
c = getchar();
}
while (isdigit(c)) {
x = x * 10 + (c ^ 48);
c = getchar();
}
return f ? -x : x;
}
struct node{
int u,v,w;
}e[N<<2];
struct line{
int v,nxt;
}E[N<<2];
int f[N],n,m,val[N],tot,h[N],fa[N],dep[N],siz[N],wg[N],top[N],vis[N],ff[N];
void dfs1(int u,int f){
fa[u]=f;
dep[u]=dep[f]+1;
siz[u]=1;
vis[u]=1;
for(int i=h[u];i;i=E[i].nxt){
int v=E[i].v;
if(v==f)continue;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[wg[u]]<siz[v])wg[u]=v;
}
}
void dfs2(int u,int Top){
top[u]=Top;
if(wg[u]){
dfs2(wg[u],Top);
for(int i=h[u];i;i=E[i].nxt){
int v=E[i].v;
if(v==fa[u]||v==wg[u])continue;
dfs2(v,v);
}
}
}
int LCA(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=fa[top[x]];
}
if(dep[x]>dep[y])return y;
return x;
}
void add(int u,int v){
E[++tot].v=v;
E[tot].nxt=h[u];
h[u]=tot;
}
int fid(int x){
while(x!=f[x]){
x=f[x]=f[f[x]];
}
return x;
}
bool cmp(node x,node y){
return x.w<y.w;
}
void kul_tre(){
for(int i=1;i<=n;i++)f[i]=i;
int cnt=0,ans=0;
sort(e+1,e+1+m,cmp);
for(int i=1;i<=m;i++){
int x=fid(e[i].u),y=fid(e[i].v);
if(x==y)continue;
cnt++;
ans+=e[i].w;
val[cnt]=e[i].w;
f[cnt]=f[x]=f[y]=cnt;
add(x,cnt);add(cnt,x);
add(y,cnt);add(cnt,y);
if(cnt==n-1)break;
}
// for(int i=1;i<=cnt;i++){
// if(!vis[i]){
// dfs1(i,0);
// dfs2(i,i);
// }
// }
dfs1(cnt,0);
dfs2(cnt,cnt);
}
signed main() {
n=read(),m=read();
for(int i=1;i<=m;i++){
int u=read(),v=read();
int w=read();
e[i]={u,v,w};
}
kul_tre();
int q=read();
val[0]=-1;
while(q--){
int x=read(),y=read();
cout<<val[LCA(x,y)];
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...