记录编号 336252 评测结果 AAAAAAAAAA
题目名称 图的询问 最终得分 100
用户昵称 Gravatar安呐一条小咸鱼。 是否通过 通过
代码语言 C++ 运行时间 0.118 s
提交时间 2016-11-03 06:31:18 内存使用 4.92 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 45000 + 10;
int n,m,k,tot,head[maxn],x,y,z,cnt,L,R,top[maxn],id[maxn],maxnum[maxn<<2];
int size[maxn],fa[maxn],dis[maxn],deep[maxn],son[maxn],dfn[maxn],f[maxn];
int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
struct Edge{
	int to,next,dis,from;
}edge[maxn<<1],e[maxn<<1];
void Addedge(int x,int y,int z)
{
	edge[++tot].to=y;
	edge[tot].dis=z;
	edge[tot].next=head[x];
	head[x]=tot;
}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
bool cmp(const Edge & x , const Edge & y ){
	return x.dis < y.dis;
}
void Krusal(){
	for(int i=1;i<=n;i++)f[i]=i;
	for(int i=1;i<=m;i++){
		int f1=find(e[i].from),f2=find(e[i].to);
		if(f1!=f2){
			f[f2]=f1;
			Addedge(e[i].from,e[i].to,e[i].dis);
			Addedge(e[i].to,e[i].from,e[i].dis);
		}
	}
}
void dfs(int x){
	size[x]=1;
	for(int i=head[x];i;i=edge[i].next){
		int p=edge[i].to;
		if(size[p])continue;
		fa[p]=x;
		dis[p]=edge[i].dis;
		deep[p]=deep[x]+1;
		dfs(p);
		size[x]+=size[p];
		if(size[p]>size[son[x]])son[x]=p;
	}
}
void dfs2(int x,int tp){
	dfn[x]=++cnt;top[x]=tp;id[cnt]=x;
	if(son[x])dfs2(son[x],tp);
	for(int i=head[x];i;i=edge[i].next){
		int p=edge[i].to;
		if(!dfn[p])dfs2(p,p);
	}
}
void build(int rt,int l,int r){
	if(l==r){maxnum[rt]=dis[id[l]] ;return;}
	int mid = (l+r)>>1;
	build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
	maxnum[rt]=max(maxnum[rt<<1],maxnum[rt<<1|1]);
}
int query_max(int rt,int l,int r){
	if( L <= l && R >= r)return maxnum[rt];
	int mid=(l+r)>>1,ans=-0x7f7f7f7f;
	if(L<=mid)ans=max(ans,query_max(rt<<1,l,mid));
	if(R>mid)ans=max(ans,query_max(rt<<1|1,mid+1,r));
	return ans;
}
int Query_max(int x,int y){
	int ans=-0x7f7f7f7f ;
	while(top[x]!=top[y]){
		if(deep[top[x]]<deep[top[y]])std::swap(x,y);
		L=dfn[top[x]],R=dfn[x] ;
		ans=max(ans,query_max(1,1,n));
		x=fa[top[x]];
	}
	if(deep[x]>deep[y])swap(x,y);
	L=dfn[son[x]],R=dfn[y];
	ans=max(ans,query_max(1,1,n));
	return ans;
}
int lca(int x,int y){
	while(top[x]!=top[y]){
		if(deep[top[x]]<deep[top[y]])swap(x,y);
		x=fa[top[x]];
	}
	if(deep[x]<deep[y])return x;
	else return y;
}
int main(){
	freopen("heatwave.in","r",stdin);
	freopen("heatwave.out","w",stdout);
	n=read();m=read();k=read();
	for(int i=1;i<=m;i++){
		x=read();y=read();z=read();
		e[i].from=x; e[i].to=y; e[i].dis=z;
	}
	sort(e+1,e+1+m,cmp); Krusal();
	deep[1]=1;dfs(1);dfs2(1,1);	 build(1,1,n);
	while(k--){
		x=read();y=read();
		printf("%d\n",Query_max(x,y));
	//	printf("%d\n",dis[x]+dis[y]-2*dis[lca(x,y)]);
	}
//	system("pause");
}