记录编号 134590 评测结果 AAAAAAAAAA
题目名称 [NOIP 2013]货车运输 最终得分 100
用户昵称 GravatarJSX 是否通过 通过
代码语言 C++ 运行时间 0.053 s
提交时间 2014-10-30 15:36:34 内存使用 2.69 MiB
显示代码纯文本
/*
	Name:1439. [NOIP2013]货车运输
	Author:hzoi-jsx
	Date:30/10/14 15:38
	Description: 倍增
*/
#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstring>
#include <climits>
#include <algorithm>
using namespace std;

int N=0,M=0,r1=0,r2=0,Q=0,Deep;
int F[10010]={0},D[10010]={0};
inline int find(int x){
	if(F[x]!=x) F[x]=find(F[x]);
	return F[x];
}
inline bool Union(int x,int y){
    r1=find(x); r2=find(y);
    if(r1==r2) return false;
    else{
        F[r2]=r1; return true;
	}
}

inline int Getint() {
	int ret,neg;	char ch;
	ret = neg = 0 ; while (!isdigit(ch=getchar())&&ch!='-') ;
	if (ch=='-') neg = 1 , ch=getchar() ;
	while (ret = ret*10+ch-'0' , isdigit(ch=getchar())) ;
	if (neg) ret = -ret ;
	return ret ;
}

class node{
	public:
		int s,t,v;
		bool operator < (const node& b) const {
			return v>=b.v;
		}
}E[50010];

class data{
	public:
		int to,next,v;
}T[30010];
int line[30010]={0},tot=0;
inline void Insert(int x,int y,int v){
   tot++; T[tot].to=y; T[tot].v=v; T[tot].next=line[x]; line[x]=tot;
}
int W[10010][17]={0},Fa[10010][17]={0};
void Build(int x,int deep){
	D[x]=deep;
	for(int i=line[x];i!=0;i=T[i].next){
		int p=T[i].to;
		if(!Fa[p][0]){
			Fa[p][0]=x; W[p][0]=T[i].v; Build(p,deep+1);
		}
	}
}

int LCA(int x,int y){
	int Res=INT_MAX;
	if(D[x]<D[y]) swap(x,y);
	for(int j=Deep-1;j>=0;--j){
		if(D[Fa[x][j]]>=D[y]){
			Res=min(Res,W[x][j]); x=Fa[x][j];
		}
	}
	if(x!=y){
		for(int j=Deep-1;j>=0;--j){
			if(Fa[x][j]!=Fa[y][j]){
				Res=min(Res,min(W[x][j],W[y][j]));
				x=Fa[x][j]; y=Fa[y][j];
			}
		}
		Res=min(Res,min(W[x][0],W[y][0]));
	}
	return Res;
}

int main(){
    freopen("truck.in","r",stdin);
	freopen("truck.out","w",stdout);

	N=Getint();M=Getint();
	Deep=(int)(log((double)N)/log(2.0))+1;

	for(int i=1;i<=M;++i){
		E[i].s=Getint(); E[i].t=Getint(); E[i].v=Getint();
	}
	sort(E+1,E+M+1);
	for(int i=1;i<=N;++i) F[i]=i;
	for(int i=1;i<=M;++i){
		if(Union(E[i].s,E[i].t)){
			Insert(E[i].s,E[i].t,E[i].v);
			Insert(E[i].t,E[i].s,E[i].v);
		}
	}
	for(int i=1;i<=N;++i){
		if(!Fa[i][0]){
			W[i][0]=INT_MAX; Fa[i][0]=i; Build(i,1);
		}
	}
	for(int j=1;j<Deep;++j){
		for(int i=1;i<=N;++i){
			Fa[i][j]=Fa[Fa[i][j-1]][j-1];
			W [i][j]=min(W[i][j-1],W[Fa[i][j-1]][j-1]);
		}
	}

	Q=Getint();
	int x=0,y=0;
	for(int i=1;i<=Q;++i){
		x=Getint();y=Getint();
		if(find(x)!=find(y)) puts("-1");
		else printf("%d\n",LCA(x,y));
	}
	return 0;
}