记录编号 158398 评测结果 AAAAAAAAAA
题目名称 [NOIP 2013]货车运输 最终得分 100
用户昵称 Gravatarnew ioer 是否通过 通过
代码语言 C++ 运行时间 0.036 s
提交时间 2015-04-14 19:02:46 内存使用 23.56 MiB
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<algorithm>
const int maxn=200010;
char ch[10000000],*ptr=ch;
struct edge{
	int x,y,v;
}e[maxn];
int n,m,k,q[maxn],f[maxn],val[maxn];
int M,tot,head[maxn],to[maxn],next[maxn],len[maxn];
int w[maxn],tr[maxn],fa[maxn],dep[maxn],siz[maxn],top[maxn],son[maxn],ans[maxn];
void swap(int &x,int &y){
	x^=y,y^=x,x^=y;
}
inline void ins(const int &u,const int &v,const int &w){
	to[++tot]=v,next[tot]=head[u],len[tot]=w,head[u]=tot;
}
inline bool cmp(const edge &a,const edge &b){
	return a.v>b.v;
}
inline int max(const int &x,const int &y){
	if(x<y) return x;
	return y;
}
inline int _find(const int &x){
	if(f[x]!=x) return f[x]=_find(f[x]);
	return x;
}
inline int read(){
	static int x;x=0;
	while(*ptr<48)ptr++;while(*ptr>47)x=x*10+*ptr++-48;
	return x;
}
inline int ask(int s,int t){
	static int res;res=1e8;
	for(s+=M-1,t+=M+1;s^t^1;s>>=1,t>>=1){
		if(~s&1) res=max(res,tr[s^1]);
		if( t&1) res=max(res,tr[t^1]);
	}
	return res;
}
inline int query(int u,int v){
	static int res;res=1e8;
	for(int fu=top[u],fv=top[v];fu!=fv;u=fa[fu],fu=top[u]){
		if(dep[fu]<dep[fv]) swap(fu,fv),swap(u,v);
		res=max(res,ans[u]);
	}
	if(u==v) return res;
	if(dep[u]>dep[v]) swap(u,v);return max(res,ask(w[u]+1,w[v]));
}
int main(){
	freopen("truck.in","r",stdin);
	freopen("truck.out","w",stdout);
	fread(ch,1,10000000,stdin);
	n=read(),m=read();
	for(int i=1;i<=n;i++) f[i]=i;
	for(int u,v,ww,i=0;i<m;i++) u=read(),v=read(),ww=read(),e[i]=(edge){u,v,ww};
	std::sort(e,e+m,cmp);for(M=1;M<n+2;M<<=1);
	for(int u,v,i=0,j=1;i<m&&j<n;i++){
		u=_find(e[i].x),v=_find(e[i].y);
		if(u!=v) j++,f[v]=u,ins(e[i].x,e[i].y,e[i].v),ins(e[i].y,e[i].x,e[i].v);
	}
	int l=1,r=0,u;
	for(int j=1;j<=n;j++)
		if(_find(j)==j){
			q[++r]=j;
			while(l<=r){
				u=q[l++],siz[u]=1;
				for(int i=head[u];i;i=next[i])
					if(to[i]!=fa[u])
						dep[to[i]]=dep[u]+1,fa[to[i]]=u,q[++r]=to[i],val[to[i]]=len[i];
			}		
		}
	for(int i=n;i;i--){
		u=q[i];
		for(int j=head[u];j;j=next[j])
			if(to[j]!=fa[u]){
				siz[u]+=siz[to[j]];
				if(siz[to[j]]>siz[son[u]]) son[u]=to[j];
			}
	}
	for(int cnt=0,i=1;i<=n;i++){
		u=q[i];
		if(son[fa[u]]!=u){
			top[u]=u,ans[u]=val[u],w[u]=++cnt,tr[M+cnt]=val[u],u=son[u];
			while(u) ans[u]=max(ans[fa[u]],val[u]),w[u]=++cnt,tr[M+cnt]=val[u],u=son[u];
		}
		else top[u]=top[fa[u]];
	}
	for(int i=M-1;i;i--) tr[i]=max(tr[i<<1],tr[i<<1|1]);
	k=read();while(k--){
		l=read(),r=read();
		if(f[l]!=f[r]) puts("-1");
		else printf("%d\n",query(l,r));
	}
}