48pts WA on #3,4,5,6,11,12 求助
查看原帖
48pts WA on #3,4,5,6,11,12 求助
905268
Underage_potato楼主2024/3/16 09:00

rt

constexpr int N=3e5+10;

int n,m,cnt;

struct node{
	int u,v,dis;
};node G[N];

struct Node{
	int to,nxt;
};Node E[N];

int head[N],tot;
int val[N],ff[N],vis[N];
int fa[N],top[N],son[N];
int size[N],dep[N];

bool cmp(node a,node b){
	return a.dis<b.dis;
}

void add(int u,int v){
	E[++tot].nxt=head[u];
	E[tot].to=v;
	head[u]=tot;
} 

int find(int x){
	if(x==ff[x]){
		return x;
	}
	else{
		return ff[x]=find(ff[x]);
	}
}

void dfs1(int u,int f){
	size[u]=1,vis[u]=1;
	for(int i=head[u];i;i=E[i].nxt){
		int v=E[i].to;
		if(v==f){
			continue;
		}
		dep[v]=dep[u]+1;
		fa[v]=u;
		dfs1(v,u);
		size[u]+=size[v];
		if(size[v]>size[son[u]]){
			son[u]=v;
		}
	}
}

void dfs2(int u,int t){
	top[u]=t;
	if(son[u]){
		dfs2(son[u],t);
	}
	for(int i=head[u];i;i=E[i].nxt){
		int v=E[i].to;
		if(v==fa[u] || v==son[u]){
			continue;
		}
		dfs2(v,v);
	}
}

void kruskal(){
	sort(G+1,G+1+m,cmp);
	rep(i,1,n,1){
		ff[i]=i;
	}
	rep(i,1,m,1){
		int fu=find(G[i].u),fv=find(G[i].v);
		if(fu!=fv){
			val[++cnt]=G[i].dis;
			ff[cnt]=ff[fu]=ff[fv]=cnt;
			add(fu,cnt);add(cnt,fu);add(fv,cnt);add(cnt,fv);
		}
	}
	rep(i,1,cnt,1){
		if(!vis[i]){
			int f=find(i);
			dfs1(f,0);
			dfs2(f,f);
		}
	}
}

int LCA(int u,int v){
	while(top[u]!=top[v]){
		if(dep[top[u]]>dep[top[v]]){
			u=fa[top[u]];
		}
		else{
			v=fa[top[v]];
		}
	}
	return dep[u]<dep[v]?u:v;
}

void solve(){
	n=Read<int>(),m=Read<int>();
	cnt=n;
	rep(i,1,m,1){
		G[i].u=Read<int>(),G[i].v=Read<int>(),G[i].dis=Read<int>();
	}
	kruskal();
	int q=Read<int>();
	while(q--){
		int u=Read<int>(),v=Read<int>();
		if(find(u)!=find(v)){
			cout<<"impossible\n";
		}
		else{
			Write(val[LCA(u,v)],'\n');
		}
	} 
}
2024/3/16 09:00
加载中...