求助,LCA+最大生成树95分
查看原帖
求助,LCA+最大生成树95分
149219
_mazetorches楼主2020/10/4 22:55

RT,看了看数据,好像是-1没判到?输出了7,实际上要输出-1.

有奆佬帮忙看看吗qwq

#include<bits/stdc++.h>
using namespace std;
int n,m,q;
struct node{
	int u,v,w;
}a[100005];
int to[200005],nx[200005],st[200005],zhi[200005],tot,z[200005];
void add(int u,int v,int w){
	to[++tot]=v;
	zhi[tot]=w;
	nx[tot]=st[u];
	st[u]=tot;
}
bool cmp(node a,node b){
	return a.w>b.w;
}
int fa[100005];
int find(int p){
	if(fa[p]==p) return p;
	else return fa[p]=find(fa[p]);
}
int shen[100005],dp[100005][21],dfn[100005];
void dfs(int now,int fa) {
    dp[now][0]=fa;
	dfn[now]=dfn[fa]+1;
    for(int i=1;i<=shen[dfn[now]];i++){
    	dp[now][i]=dp[dp[now][i-1]][i-1];
	}
    for(int i=st[now];i;i=nx[i]){
    	if(to[i]!=fa){
    		z[to[i]]=zhi[i];
    		dfs(to[i],now);
		}
	}
}
int LCAohLCA(int u,int v){
	if(find(u)!=find(v)) return -1;
	if(dfn[u]<dfn[v]){
		swap(u,v);
	}
    while(dfn[u]>dfn[v]){
    	u=dp[u][shen[dfn[u]-dfn[v]]-1];
	}
    if(u==v) {
    	return u;
	}
    for(int i=shen[dfn[u]]-1;i>=0;i--){
    	if(dp[u][i]!=dp[v][i]){
        	u=dp[u][i];
			v=dp[v][i];
		}
	}
    return dp[u][0];
} 
int tiao(int u,int f){
	int ans=2147483647;
	while(u!=f){
		ans=min(ans,z[u]);
		u=dp[u][0];
	}
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		shen[i]=shen[i-1]+(1<<shen[i-1]==i);
	}
	for(int i=1;i<=n;i++) fa[i]=i;
	int u,v,w;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
	}
	sort(a+1,a+m+1,cmp);
	int cnt=0,now=1;
	while(1){
		int u=find(a[now].u),v=find(a[now].v);
		if(u!=v){
			fa[u]=v;
			cnt++;
			add(a[now].u,a[now].v,a[now].w);
			add(a[now].v,a[now].u,a[now].w);
			if(cnt==n-1) break;
		}
		now++;
	}
	dfs(1,1);
	scanf("%d",&q);
	for(int i=1;i<=q;i++){
		scanf("%d%d",&u,&v);
		int L=LCAohLCA(u,v);
		if(L==-1){
			cout<<-1<<endl;
			continue;
		}
		int maxx=2147483647;
		maxx=min(maxx,tiao(u,L));//O(n)
		maxx=min(maxx,tiao(v,L));
		printf("%d\n",maxx);
	}
}
2020/10/4 22:55
加载中...