记录编号 521854 评测结果 AAAAAAAAAA
题目名称 [NOIP 2013]货车运输 最终得分 100
用户昵称 GravatarFisher. 是否通过 通过
代码语言 C++ 运行时间 0.223 s
提交时间 2018-11-07 22:24:07 内存使用 4.46 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
const int maxn=10010;
const int maxm=50010;
int n,m,q;

struct ee{int u,v,w;}e[maxm];
inline bool cmp(ee a,ee b){return a.w>b.w;}
int bfa[maxn];
vector<int>t[maxn],w[maxn];
bool vis[maxn];
int val[maxn];
int tot,sz[maxn],fa[maxn],dep[maxn],son[maxn],top[maxn],id[maxn],pre[maxn];
inline int find(int x){return bfa[x]==x?x:bfa[x]=find(bfa[x]);}
inline void kruskal(){
	for(int i=1;i<=n;i++)bfa[i]=i;
	sort(e+1,e+m+1,cmp);
	int cnt=0;
	for(int i=1;i<=m;i++){
		int u=find(e[i].u),v=find(e[i].v);
		if(u!=v){
			cnt++;
			t[e[i].u].push_back(e[i].v);
			t[e[i].v].push_back(e[i].u);
			w[e[i].u].push_back(e[i].w);
			w[e[i].v].push_back(e[i].w);
			bfa[u]=v;
		}
		if(cnt==n-1)break;
	}
}

inline void dfs1(int u,int f,int d){
	sz[u]=1;fa[u]=f;dep[u]=d;vis[u]=true;
	int len=t[u].size();
	for(int i=0;i<len;i++){
		int v=t[u][i];
		if(v==f)continue;
		dfs1(v,u,d+1);
		val[v]=w[u][i];
		sz[u]+=sz[v];
		if(!son[u]||sz[son[u]]<sz[v])son[u]=v;
	}
}
inline void dfs2(int u,int tou){
	top[u]=tou;id[u]=++tot;pre[tot]=u;
	if(!son[u])return ;
	dfs2(son[u],tou);
	int len=t[u].size();
	for(int i=0;i<len;i++){
		int v=t[u][i];
		if(v!=fa[u]&&v!=son[u])dfs2(v,v);
	}
}

int minn[maxn<<2];
inline void build(int o,int l,int r){
	if(l==r){
		minn[o]=val[pre[l]];
		return;
	}
	int m=(l+r)>>1,ls=o<<1,rs=ls|1;
	build(ls,l,m);
	build(rs,m+1,r);
	minn[o]=min(minn[ls],minn[rs]);
}
inline int findmin(int o,int l,int r,int nl,int nr){
	if(l>=nl&&r<=nr)return minn[o];
	int m=(l+r)>>1,ls=o<<1,rs=ls|1;
	int ans=0x3f3f3f3f;
	if(m>=nl)ans=min(ans,findmin(ls,l,m,nl,nr));
	if(m<nr)ans=min(ans,findmin(rs,m+1,r,nl,nr));
	return ans;
}
inline void getans(int x,int y){
	int u=top[x],v=top[y];
	int ans=0x3f3f3f3f;
	while(u!=v){
		if(dep[u]<dep[v])swap(u,v),swap(x,y);
		ans=min(ans,findmin(1,1,tot,id[u],id[x]));
		//cout<<ans<<" "<<findmin(1,1,n,id[x],id[u])<<endl;
		x=fa[u];u=top[x];
	}
	if(dep[x]<dep[y])swap(x,y);
	if(x!=y)ans=min(ans,findmin(1,1,tot,id[son[y]],id[x]));
	//cout<<id[x]<<" "<<id[y]<<endl;
	if(ans==0x3f3f3f3f)puts("-1");
	else printf("%d\n",ans);
}
int main(){
	freopen("truck.in","r",stdin);
	freopen("truck.out","w",stdout);
	n=read();m=read();
	for(int i=1;i<=m;i++){
		e[i].u=read(),e[i].v=read(),e[i].w=read();
	}
	kruskal();
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			val[i]=0x3f3f3f3f;
			dfs1(i,0,1);
			dfs2(i,i);
		}
	}
	q=read();
	build(1,1,tot);
	for(int i=1;i<=q;i++){
		int x=read(),y=read();
		getans(x,y);
	}
	return 0;
}