【求助】连一分都没得的蒟蒻
查看原帖
【求助】连一分都没得的蒟蒻
19228
蒟蒻炒扇贝楼主2020/7/10 18:49
#include<iostream>
#include<algorithm>
using namespace std;
const int maxh=20,inf=29999999;
struct edge
{
	int v,nxt,dis,u;
}a[100005],b[100005];
int cmp(edge a,edge b)
{
	return a.dis>b.dis;
}
int f[100005],cnt,head[100005],n,m,q,vis[100005],deep[100005],w[10005][10005],fa[10005][10005];
int findf(int x)
{
	if(f[x]!=x)f[x]=findf(f[x]);
	return f[x];
}
void addedge(int u,int v,int dis)
{
	a[++cnt].dis=dis;
	a[cnt].v=v;
	a[cnt].nxt=head[u];
	head[u]=cnt;
}
void kkk()
{
	sort(b+1,b+1+m,cmp);
	for(int i=1;i<=n;i++)
		f[i]=i;
	for(int i=1;i<=m;i++)
	{
		if(findf(b[i].u)!=findf(b[i].v))
		{
			f[findf(b[i].u)]=findf(b[i].v);
			addedge(b[i].u,b[i].v,b[i].dis);
			addedge(b[i].v,b[i].u,b[i].dis);
		}
	}
}
void dfs(int now,int depth)
{
	vis[now]=1;
	for(int i=head[now];i;i=a[i].nxt)
	{
		int to=a[i].v;
		if(!vis[to])
		{
			deep[now]=depth;
			fa[to][0]=now;
			w[to][0]=a[i].dis;
			dfs(to,depth+1);
		}
	}
}
void init()
{
	for(int j=1;j<=maxh;j++)
	 for(int i=1;i<=n;i++)
	 {
	 	fa[i][j-1]=fa[fa[i][j-1]][j-1];
	 	w[i][j-1]=min(w[i][j-1],w[fa[i][j-1]][j-1]);
	 }
}
int lca(int x,int y)
{
	if(findf(x)!=findf(y))return -1;
	if(deep[x]<deep[y])swap(x,y);
	int ans=inf;
	int de=deep[x]-deep[y];
	for(int j=maxh;j>=0;j--)
		if((1<<j)&de)
		{
			ans=min(ans,w[x][j]);
			x=fa[x][0];
		}
	if(x==y)return ans;
	for(int j=maxh;j>=0;j--)
		if(fa[x][j]!=fa[y][j])
		{
			ans=min(ans,min(w[x][j],w[y][j]));
			x=fa[x][j];
			y=fa[y][j];
		}
	ans=min(ans,min(w[x][0],w[y][0]));
	return ans;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
		cin>>b[i].u>>b[i].v>>b[i].dis;
	kkk();
	for(int i=1;i<=n;i++)
		if(!vis[i])
		{
			deep[i]=1;
			dfs(i,1);
			fa[i][0]=i;
			w[i][0]=inf;
		}
	init();
	cin>>q;
	for(int i=1;i<=q;i++)
	{
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<endl;
	}
	return 0;
}

评测结果在这里

插一句题外话,你谷的评测姬究竟怎么了,在评测结果中,时常出现UKE这种在平时对我来说只是略有耳闻的特殊情况。。。

2020/7/10 18:49
加载中...