玄关求条
查看原帖
玄关求条
1016188
fztt_r9楼主2024/7/27 11:27
#define maxn 10005
#define maxm 50005
using namespace std;
int fa[maxn],n,m,q,cnt=1;
int find(int x) {return x==fa[x]?x:find(fa[x]);}
void merge(int x,int y){fa[find(x)]=find(y);}
struct node{int u,v,e;}bian[maxm],tree_bian[maxn];
bool cmp(node x,node y){return x.e >y.e;}

struct treee{int fa,e,dep;}tree[maxn];
bool used[maxn];
queue <int> Q;
void build(int now,int k){//深度 
	if(used[now]) return;
	tree[now].dep=k;
	for(int i=1;i<n;i++){
		int u=tree_bian[i].u,v=tree_bian[i].v,e=tree_bian[i].e;
		if(u==now) tree[v].fa=u,tree[v].e=e,used[now]=1,build(v,k+1);
		if(v==now) tree[u].fa=v,tree[u].e=e,used[now]=1,build(u,k+1);
	}
	return;
}

void up(int &x,int &ans){ans=min(ans,tree[x].e);x=tree[x].fa;}
int ask(int x,int y){
	if(find(x)!=find(y)) return -1;
	int ret=114514,cha=abs(tree[x].dep-tree[y].dep);//最大限重1e5
	if(tree[x].dep>tree[y].dep) swap(x,y);
	while(tree[x].dep!=tree[y].dep) up(y,ret);
	while(x!=y) up(x,ret),up(y,ret);
	return ret;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++) cin>>bian[i].u>>bian[i].v>>bian[i].e;
	sort(bian+1,bian+1+m,cmp);
//	for(int i=1;i<=m;i++) cout<<bian[i].u<<' '<<bian[i].v<<' '<<bian[i].e<<endl;
	for(int i=1;i<=m;i++){
		int u=bian[i].u,v=bian[i].v;
	//	cout<<i<<' '<<u<<fa[u]<<' '<<find(v)<<endl;
		if(find(u)==find(v)) continue;
		tree_bian[cnt]=bian[i];
		merge(u,v);
		if(++cnt==n) break;
	}
//	cout<<"CNT:"<<cnt<<endl;
	build(1,1);int x,y;cin>>q;
	while(q--) cin>>x>>y,cout<<ask(x,y)<<endl;
}```
2024/7/27 11:27
加载中...