比赛 20160419s 评测结果 AAAAAAAAAA
题目名称 图的询问 最终得分 100
用户昵称 瑆の時間~無盡輪迴·林蔭 运行时间 0.123 s
代码语言 C++ 内存使用 12.51 MiB
提交时间 2020-05-09 10:45:39
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
int dep[50010],val[50010],n,m,a1,a2,a3,cnt,tot,K;
int fa[50010][26];
struct PE
{
	int u,v,val;
};
PE edge[40010];
vector<int> b[50010];
bool Function(PE x,PE y)
{
	return x.val<y.val;
}
void BZ()
{
	for(int i=1;i<=25;i++)
	{
		for(int j=1;j<=tot;j++)
		{
			fa[j][i]=fa[fa[j][i-1]][i-1];
		} 
	} 
}
int LCA(int x,int y)
{
	if(dep[x]<dep[y])
		swap(x,y);
	for(int i=25;i>=0;i--)
	{
		if(dep[fa[x][i]]>=dep[y])
		{
			x=fa[x][i];
		} 
	}
	if(x==y)
		return x;
	for(int i=25;i>=0;i--)
	{
		if(fa[x][i]!=fa[y][i])
		{
			x=fa[x][i];
			y=fa[y][i];
		} 
	}
	return fa[x][0];
}
void DFS(int x,int fath)
{
	dep[x]=dep[fath]+1;
	fa[x][0]=fath;
	for(int i=0;i<b[x].size();i++)
	{
		int to=b[x][i];
		if(to==fath)
			continue;
		DFS(to,x);
	}
}
int father[50010];
int Find(int x)
{
	if(father[x]==x)
		return x;
	return father[x]=Find(father[x]);
}
int LINYIN()
{
	freopen("heatwave.in","r",stdin);
	freopen("heatwave.out","w",stdout);
	scanf("%d%d%d",&n,&m,&K);
	for(int i=1;i<=n;i++)
		father[i]=i;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a1,&a2,&a3);
		edge[i].u=a1;
		edge[i].v=a2;
		edge[i].val=a3;
	}
	sort(edge+1,edge+1+m,Function);
	tot=n;
	for(int i=1;i<=m;i++)
	{
		int fx=Find(edge[i].u),fy=Find(edge[i].v);
		if(fx==fy)
			continue;
		++tot;
		father[tot]=tot;
		father[fx]=tot;
		father[fy]=tot;
		val[tot]=edge[i].val;
		b[tot].push_back(fx);
		b[tot].push_back(fy);
	}
	DFS(tot,0);
	BZ();
	for(int i=1;i<=K;i++)
	{
		scanf("%d%d",&a1,&a2);
		printf("%d\n",val[LCA(a1,a2)]); 
	}
	return 0;
}
int LWH=LINYIN();
int main()
{
	;
}