记录编号 336641 评测结果 AAAAAAAAAA
题目名称 图的询问 最终得分 100
用户昵称 GravatarMagic_Sheep 是否通过 通过
代码语言 C++ 运行时间 0.310 s
提交时间 2016-11-03 15:45:03 内存使用 4.27 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring> 
#include<vector>
#include<algorithm>	
using namespace std;
const int maxn=45050;
int n,m,k; 
struct edge
{
	int x,y,z;
};
edge t[maxn];
vector<int> f[maxn],g[maxn];
int T_max[maxn*4]; 
int fa[maxn],x,y,z,dfs_clock;
int fath[maxn],deep[maxn],dist[maxn],son[maxn],id[maxn],dfn[maxn],top[maxn],to[maxn],sz[maxn];
int find(int x)
{
	if(fa[x]==x) return x;
	else return fa[x]=find(fa[x]);
}
bool cmp(const edge &a,const edge &b)
{
	return a.z<b.z;	
} 
void Kruskal()
{
	int cnt=n;
	sort(t+1,t+1+m,cmp);
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		if(cnt==1) return;
		int fx=find(t[i].x);
		int fy=find(t[i].y);
		if(fx!=fy)
		{
			fa[fx]=fy;
			f[t[i].x].push_back(t[i].y);
			f[t[i].y].push_back(t[i].x);
			g[t[i].x].push_back(t[i].z);
			g[t[i].y].push_back(t[i].z);
			cnt--;
		}
	}
}
void dfs1(int u,int fat,int dep,int dis)
{
	fath[u]=fat;dist[u]=dis;
	deep[u]=dep;sz[u]=1;
	for(int i=0;i<f[u].size();i++)
	{
		int v=f[u][i];
		if(v==fat) continue;
		to[v]=g[u][i];
		dfs1(v,u,dep+1,dis+g[u][i]);
		sz[u]+=sz[v];
		if(sz[son[u]]<sz[v])
			son[u]=v;
	}
} 
void dfs2(int u,int tp)
{
	top[u]=tp;
	id[u]=++dfs_clock;
	dfn[dfs_clock]=u; 
	if(son[u]) dfs2(son[u],tp); 
	for(int i=0;i<f[u].size();i++)
	{
		int v=f[u][i];
		if(v==fath[u]||v==son[u]) continue;
		dfs2(v,v); 
	} 
}
int query_max(int rt,int l,int r,int x,int y)
{
    if(x<=l&&y>=r)
    {
        return T_max[rt];
    }
    int mid=(l+r)>>1,ans=0;
    if(x<=mid) ans=max(ans,query_max(rt<<1,l,mid,x,y));
    if(y>mid) ans=max(ans,query_max(rt<<1|1,mid+1,r,x,y));
    return ans;
}
int get_max(int u,int v)
{
    int ans=0;
    int x=top[u],y=top[v];
    while(x!=y)
    {
        if(deep[x]<deep[y])
        {
            swap(u,v);swap(x,y);
        }
        ans=max(ans,query_max(1,1,n,id[x],id[u]));
        u=fath[x];x=top[u];
    }
    if(deep[u]>deep[v]) swap(u,v);
    return max(ans,query_max(1,1,n,id[son[u]],id[v]));
}
void build(int rt,int l,int r)
{
    if(l==r)
    {
        T_max[rt]=to[dfn[l]];
        return;
    }
    int mid=(l+r)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    T_max[rt]=max(T_max[rt<<1],T_max[rt<<1|1]);
}
int main()
{
	freopen("heatwave.in","r",stdin);
	freopen("heatwave.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].z);
	}
	Kruskal();
	dfs1(1,0,0,0);
	dfs2(1,1);
	build(1,1,n);
	for(int i=1;i<=k;i++)
	{
		scanf("%d%d",&x,&y);
		printf("%d\n",get_max(x,y)); 
	}
	return 0; 
}