###蒟蒻求助,“只”Wa了19个点
查看原帖
###蒟蒻求助,“只”Wa了19个点
748080
styz_gaozhiyuan楼主2023/4/30 17:39
#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y,z;
}a[100010];
int n,m,cnt=0,vis[10010],head[10010],deep[10010],dis[10010],fa[10010][22],p,minn[10010][22],f[10010];
int cmp(node u,node v)
{
	return u.z>v.z;
}
int find(int a)
{
	return f[a]==a? a:f[a]=find(f[a]);
}
struct e{
	int to,nxt,w;
}edge[20010];
void add(int a,int b,int w)
{
	edge[++cnt].to=b;
	edge[cnt].nxt=head[a];
	edge[cnt].w=w;
	head[a]=cnt;
}
void mbtree()
{
	sort(a+1,a+m+1,cmp);
	int cntt=0;
	for(int i=1;i<=m;i++)
	{
		int u=a[i].x,v=a[i].y;
		int x=find(u),y=find(v);
		if(x==y)continue;
		f[x]=y;
		int w=a[i].z;
		add(u,v,w),add(v,u,w);
		 
	}
	 
}
queue<int>q;
 
void dfs(int a)
{
	for(int i=head[a];i;i=edge[i].nxt)
	{
		int to=edge[i].to;
		if(deep[to])continue;
		deep[to]=deep[a]+1;
		fa[to][0]=a;
		minn[to][0]=edge[i].w;
		dfs(to);
	}
}
void init()
{
	memset(minn,0x3f,sizeof(minn));
	for(int j=1;j<=20;j++)
	    for(int i=1;i<=n;i++)
	    {
	    	fa[i][j]=fa[fa[i][j-1]][j-1];
	    	minn[i][j]=min(minn[i][j-1],minn[fa[i][j-1]][j-1]);
	    }
}
int LCA(int a,int b)
{
	int ans=0x3f3f3f3f;
	if(deep[a]<deep[b])swap(a,b);
	for(int i=20;i>=0;i--)
	    if(deep[fa[a][i]]>=deep[b])
	    {
	    	ans=min(ans,minn[a][i]);
	    	a=fa[a][i];
	    }
 
	if(a==b)return ans;
	for(int i=20;i>=0;i--)
	    if(fa[a][i]!=fa[b][i])
	    {
	    	ans=min(ans,min(minn[a][i],minn[b][i]));
	    	a=fa[a][i],b=fa[b][i];
	    }
 
	ans=min(ans,min(minn[a][0],minn[b][0]));
	return ans;
}
int main()
{
	cin>>n>>m;
	
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
        a[i]=(node){x,y,z};
	}
	for(int i=1;i<=n;i++)
	    f[i]=i;
	mbtree();
	init();
	for(int i=1;i<=n;i++)
	    if(f[i]==i)
	    {
	    	deep[i]=1;
	    	dfs(i);
	    }

	cin>>p;
	for(int i=1;i<=p;i++)
	{
		int x,y;
		cin>>x>>y;
		if(find(x)!=find(y))
		{
			cout<<-1<<endl;
			continue;
		}
		cout<<LCA(x,y)<<endl;
    }
	return 0;
}

2023/4/30 17:39
加载中...