比赛 |
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()
{
;
}