Kruskal+树剖 24pts 求调
查看原帖
Kruskal+树剖 24pts 求调
933802
ICU152_lowa_IS8楼主2024/7/17 00:30
#include<bits/stdc++.h>
//#define kedge sb
#define int long long
using namespace std;
int n,m;
struct node{
	int u,v,w,next;
}edge[1000005],kedge[1000005];
int num,head[1000005],khead[1000005],knum;
int a[1000005];
void add(int u,int v,int w){
	edge[++num].next=head[u];
	head[u]=num;
	edge[num].v=v;
	edge[num].w=w;
	edge[num].u=u;
}
void kadd(int u,int v,int w){
	kedge[++knum].next=khead[u];
	khead[u]=knum;
	kedge[knum].v=v;
	kedge[knum].w=w;
	kedge[knum].u=u;
}
int fa[1000005],dep[1000005],son[1000005],siz[1000005];
int id[1000005],tmp[1000005],top[1000005],cnt;
void dfs1(int now,int fath,int deep){
	fa[now]=fath;
	dep[now]=deep;
	siz[now]=1;
	int maxsiz=-1;
	for(int i=khead[now];i;i=kedge[i].next){
		int v=kedge[i].v;
		if(v==fath)continue;
		dfs1(v,now,deep+1);
		siz[now]+=siz[v];
		a[v]=kedge[i].w;
		if(maxsiz<siz[v]){
			maxsiz=siz[v];
			son[now]=v;
		}
	}
}
void dfs2(int now,int topf){
	id[now]=++cnt;
	tmp[cnt]=a[now];
	top[now]=topf;
	if(!son[now])return;
	dfs2(son[now],topf);
	for(int i=khead[now];i;i=kedge[i].next){
		int v=kedge[i].v;
		if(v==son[now]||v==fa[now])continue;
		dfs2(v,v);
	}
}
bool cmp(node a,node b){
	return a.w<b.w;
}
int father[1000005];
int find(int x){
	if(father[x]!=x)father[x]=find(father[x]);
	return father[x];
}
struct tree{
	int val,tag;
}tree[1000005<<2];
inline int ls(int p){
	return p<<1;
} 
inline int rs(int p){
	return p<<1|1;
}
inline void pushup(int p){
	tree[p].val=max(tree[ls(p)].val,tree[rs(p)].val);
}
inline void build(int p,int l,int r){
	if(l==r){
		tree[p].val=tmp[l];
		return;
	}
	int mid=l+r>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	pushup(p);
}
inline int query (int p,int l,int r,int ql,int qr){
	if(l>qr||r<ql)return INT_MIN;
//	cout<<l<<" "<<r<<" "<<tree[p].val<<endl;
	if(l>=ql&&r<=qr){
		return tree[p].val;
	}
	int mid=l+r>>1;
	return max(query(ls(p),l,mid,ql,qr),query(rs(p),mid+1,r,ql,qr));
}
inline int qrange(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		ans=max(ans,query(1,1,n,id[top[x]],id[x]));
//		cout<<id[top[x]]<<" "<<id[x]<<endl;
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
//	cout<<id[x]<<" "<<id[y]<<" "<<query(1,1,n,5,5)<<endl;
	return max(ans,query(1,1,n,id[x],id[y]));
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}
	sort(edge+1,edge+num+1,cmp);
	for(int i=1;i<=n;i++){
		father[i]=i;
	}
	int ccnt=0;
	for(int i=1;i<=num;i++){
		int fu=find(edge[i].u),fv=find(edge[i].v);
		if(fu==fv)continue;
		father[fu]=fv;
		kadd(edge[i].u,edge[i].v,edge[i].w);
		kadd(edge[i].v,edge[i].u,edge[i].w);
		ccnt++;
		if(ccnt==n-1)break;
	}
	dfs1(1,0,1);
	dfs2(1,1); 
	build(1,1,n);
//	for(int i=1;i<=n;i++){
//		cout<<tmp[i]<<" ";
//	} 
//	cout<<endl;
	int q;
	cin>>q;
	while(q--){
		int u,v;
		cin>>u>>v;
		if(find(u)!=find(v)){
			cout<<"impossible\n";
		}
		else{
			cout<<qrange(u,v)<<endl;
		}
	}
	return 0;
}
2024/7/17 00:30
加载中...