蒟蒻10分求调!
查看原帖
蒟蒻10分求调!
995895
__zyy_wgcs__楼主2024/8/9 21:16

rt,因为下载数据机会没了所以不会改了。

#include<iostream>
#include<vector> 
#include<algorithm>
#define RP i
using namespace std;
int fa[10005];
int find(int x){
	return (fa[x]==x)?x:(fa[x]=find(fa[x]));
}
struct edge2{
	int v,w;
};
vector<edge2>t[10005];
void merge(int x,int y){
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy){
		fa[fx]=fy;
	}
}
struct edge{
	int u,v,w;
}a[50005];
bool cmp(edge a,edge b){
	return a.w>b.w;
}
int dep[10005];
int f[10005][10];
int g[10005][10];
void tree(int x,int d){
	dep[x]=d;
	for(int i=0;i<t[x].size();RP++){
		if(!f[t[x][i].v][1]){
			f[t[x][i].v][1]=x;
			g[t[x][i].v][1]=t[x][i].w;
			tree(t[x][i].v,d+1);
		}
	}
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;RP++){
		fa[i]=i;
		f[i][0]=i;
	}
	for(int i=1;i<=m;RP++){
		scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
	}
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=m;RP++){
		if(find(a[i].u)!=find(a[i].v)){
			merge(a[i].u,a[i].v);
			t[a[i].u].push_back({a[i].v,a[i].w});
			t[a[i].v].push_back({a[i].u,a[i].w});
		}
	}
	for(int i=1;i<=n;RP++){
		if(!f[i][1]){
			f[i][1]=-1;
			tree(i,0);
			f[i][1]=0;
		}
	}
	for(int i=2;i<=n;RP++){
		for(int j=2;j<=9;j++){
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
	for(int i=2;i<=n;RP++){
		for(int j=2;j<=9;j++){
			g[i][j]=min(g[i][j-1],g[f[i][j-1]][j-1]);
		}
	}
	int q;
	scanf("%d",&q);
	while(q--){
		int x,y,ans=0x3fffffff;
		scanf("%d%d",&x,&y);
		if (dep[x]<dep[y]){
			swap(x,y);
		}
		for (int j=9;j>=0;j--){
			if(dep[x]<=dep[y]){
				break;
			}
			if(f[x][j]){
				ans=min(ans,g[x][j]);
				x=f[x][j];
			}
		}
		if(x==y){
			printf("%d\n",ans);
			continue;
		}
		for(int j=9;j>0;j--){
			if(f[x][j]!=f[y][j]&&f[x][j]&&f[y][j]){
				ans=min(ans,min(g[x][j],g[y][j]));
				x=f[x][j];
				y=f[y][j];
				if(f[x][j]!=f[y][j]&&f[x][j]&&f[y][j]){
					ans=min(ans,min(g[x][j],g[y][j]));
					x=f[x][j];
					y=f[y][j];
				}
			}
		}
		if(ans<100000000){
			printf("%d\n",ans);
		}
		else if(f[x][1]==f[y][1]&&f[x][1]!=0){
			printf("%d\n",min(g[x][1],g[y][1]));
		}
		else{
			printf("-1\n");
		}
	}
	return 0;
}
2024/8/9 21:16
加载中...