社区讨论

P1967 WA10 求调

学术版参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m4xs6k6k
此快照首次捕获于
2024/12/21 14:10
去年
此快照最后确认于
2024/12/21 14:51
去年
查看原帖
CPP
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct s{
	long long st,en;
	long long w;
};
s arr[1000005];
long long n,m,k;
long long a,b;
long long fa[1000005];
long long num[1000005],pre[1000005],wh[1000005],last[100005],cnt;
long long t[1000005];
long long dep[1000005];
long long roo[1000005][25],dis[1000005][25];
bool cmp(s x,s y){
	return x.w>y.w;
}
long long getfa(long long x){
	if(fa[x]==x){
		return x;
	}
	else{
		return fa[x]=getfa(fa[x]);
	}
}
void add(long long x,long long y,long long z){
	++cnt;
	num[cnt]=y;
	pre[cnt]=last[x];
	wh[cnt]=z;
	last[x]=cnt;
}
void klu(){
	sort(arr+1,arr+1+m,cmp);
	for(long long i=1;i<=n;i=-(~i)){
		fa[i]=i;
	}
	long long tmp=0;
	for(long long i=1;i<=m&&tmp<n-1;i=-(~i)){
		if(getfa(arr[i].st)==getfa(arr[i].en)){
			continue;
		}
		else{
			fa[fa[arr[i].st]]=fa[arr[i].en];
			add(arr[i].st,arr[i].en,arr[i].w);
			add(arr[i].en,arr[i].st,arr[i].w);
			tmp++;
		}
	}
}
void dfs(long long xy){
	t[xy]=1;
	for(long long i=last[xy];i;i=pre[i]){
		if(t[num[i]]==1){
			continue;
		}
		else{
			dep[num[i]]=dep[xy]+1;
			roo[num[i]][0]=xy;
			dis[num[i]][0]=wh[i];
			t[num[i]]=1;
			dfs(num[i]);
		}
	}
}
void mak(){
	for(long long i=1;i<=n;i++){
		for(long long j=1;j<=20;j++){
			roo[i][j]=roo[roo[i][j-1]][j-1];
			dis[i][j]=min(dis[i][j-1],dis[roo[i][j-1]][j-1]);
		}
	}
}
long long get(long long x,long long y){
	if(getfa(x)!=getfa(y)){
		return -1;
	}
	long long ans=0x3f3f3f3f3f;
	if(dep[x]<dep[y]){
		swap(x,y);
	}
	for(long long i=20;i>=0;i--){
		if(dep[roo[x][i]]>=dep[y]){
			ans=min(ans,dis[x][i]);
			x=roo[x][i];			
		}
	}
	if(x==y){
		return ans;
	}
	else{
		for(long long i=20;i>=0;i--){
			if(roo[x][i]!=roo[y][i]){
				ans=min(ans,min(dis[x][i],dis[y][i]));
				x=roo[x][i];
				y=roo[y][i];
			}
		}
		return min(ans,min(dis[x][0],dis[y][0]));
	}
}
int main(){
	cin>>n>>m;
	for(long long i=1;i<=m;i=-(~i)){
		cin>>arr[i].st>>arr[i].en>>arr[i].w;
	}
	klu();
	for(long long i=1;i<=n;i++){
		if(t[i]==0){
			dep[i]=1;
			dfs(i);
			roo[i][0]=i;
			dis[i][0]=0x3f3f3f3f3f;
		}
	}
	mak();
	cin>>k;
	for(long long i=1;i<=k;i++){
		cin>>a>>b;
		printf("%lld\n",get(a,b));
	}
	return 0;
}
码风有点丑,大佬们将就看吧orz

回复

1 条回复,欢迎继续交流。

正在加载回复...