求助,#5、#6、#9、#10TLE,用的方法是克鲁斯卡尔和LCA
查看原帖
求助,#5、#6、#9、#10TLE,用的方法是克鲁斯卡尔和LCA
218999
啷里个浪楼主2021/6/2 16:45

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,q,cnt,head[100100],fa[100100][15],fai[100100],minn[100100][15],dep[100100];
struct kruskal{
	int from,to,val;
	bool operator <(const kruskal &b)const{
		return val<b.val ;
	}
}line[300100];
struct node{
	int to,next,val;
}a[200100];
inline int read(){
	int s=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s;
}
int mymax(int x,int y){
	if(x>y)return x;
	else return y;
}
void add(int u,int v,int w){
	++cnt;
	a[cnt].to =v;
	a[cnt].next =head[u];
	a[cnt].val =w;
	head[u]=cnt;
}
int find(int x){
	return fai[x]==x?x:find(fai[x]);
}
void build(int x,int f){
	for(int i=head[x];i;i=a[i].next ){
		int v=a[i].to ;
		if(f!=v){
			dep[v]=dep[x]+1;
			fa[v][0]=x;
			minn[v][0]=a[i].val ;
			build(v,x);
		}
	}
}
int query(int x,int y){
	int ans=-1;
	if(dep[x]<dep[y])swap(x,y);
	for(int i=14;i>=0;i--){
		if(fa[x][i]&&dep[fa[x][i]]>=dep[y]){
			ans=mymax(ans,minn[x][i]);
			x=fa[x][i];
		}
	}
	if(x==y)return ans;
	for(int i=14;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			ans=mymax(ans,minn[x][i]);
			ans=mymax(ans,minn[y][i]);
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	ans=mymax(ans,minn[x][0]);
	ans=mymax(ans,minn[y][0]);
	return ans;
}
int main(){
	n=read();m=read();
	for(int i=1;i<=m;i++){
		int u,v,w;
		if(i<=n)fai[i]=i;
		u=read();v=read();w=read();
		line[i]=((kruskal){u,v,w});
	}
	sort(line+1,line+1+m);
	int js=0;
	for(int i=1;i<=m;i++){
		int u=find(line[i].from ),v=find(line[i].to );
		if(u!=v){
			fai[u]=v;
			add(line[i].from ,line[i].to ,line[i].val );
			add(line[i].to ,line[i].from ,line[i].val );
			++js;
			if(js+1==n)break;
		}
	}
	for(int i=1;i<=n;i++){
		if(!dep[i]){
			dep[i]=1;
			build(i,i);
		}
	}
	for(int i=1;i<=15;i++){
		for(int j=1;j<=n;j++){
			fa[j][i]=fa[fa[j][i-1]][i-1];
			minn[j][i]=mymax(minn[j][i-1],minn[fa[j][i-1]][i-1]);
		}
	}
	q=read();
	for(int i=1;i<=q;i++){
		int u,v;
		u=read();v=read();
		if(find(u)!=find(v))cout<<"impossible"<<endl;
		else cout<<query(u,v)<<endl;
	}
	return 0;
}
2021/6/2 16:45
加载中...