记录编号 121999 评测结果 AAAAAAAAAA
题目名称 [NOIP 2013]货车运输 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.476 s
提交时间 2014-09-22 12:09:07 内存使用 2.75 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<climits>
#include<cmath>
#define Maxn 10001
#define Maxp 30001
#define Maxm 50001
using namespace std;
struct node{
	int x,y,v;
	bool operator<(const node &a)const{
		return v>a.v;
	}
}V[Maxm]={0},A[Maxp]={0};
vector<int> T[Maxn],C[Maxn];
int n,m,p,father[Maxn],L[Maxn]={0},kt;
int fa[Maxn][20]={0},w[Maxn][20]={0};
int find(int x){
	if(father[x]!=x) father[x]=find(father[x]);
	return father[x];
}
void unionn(int x,int y){
	int a=find(x);
	int b=find(y);
	if(a!=b) father[b]=a;
}
void dfs(int now,int deep){
	L[now]=deep;
	for(int j=0;j<T[now].size();j++)
	{
		if(!fa[T[now][j]][0])
		{
			fa[T[now][j]][0]=now;
			w[T[now][j]][0]=C[now][j];
			dfs(T[now][j],deep+1);
		}
	}
}
int LCA(int x,int y){
	int res=INT_MAX;
	if(L[x]<L[y]) swap(x,y);
	for(int i=kt-1;i>=0;i--)
	{
		if(L[fa[x][i]]>=L[y])
		{
			res=min(res,w[x][i]);
			x=fa[x][i];
		}
	}
	if(x!=y)
	{
		for(int j=kt-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]));
		x=fa[x][0];
		y=fa[y][0];
	}
	return res;
}
void work(){
	int team=p;
	for(int i=1;i<=n;i++) father[i]=i;
	sort(V+1,V+m+1);
	for(int i=1;team&&i<=m;i++)
	{
		if(find(V[i].x)!=find(V[i].y))
		{
			unionn(V[i].x,V[i].y);
			T[V[i].x].push_back(V[i].y);
			C[V[i].x].push_back(V[i].v);
			T[V[i].y].push_back(V[i].x);
			C[V[i].y].push_back(V[i].v);
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(!fa[i][0])
		{
			w[i][0]=INT_MAX;
			fa[i][0]=i;
			dfs(i,1);
		}
	}
	for(int i=1;i<kt;i++)
	{
		for(int j=1;j<=n;j++)
		{
			fa[j][i]=fa[fa[j][i-1]][i-1];
			w[j][i]=min(w[j][i-1],w[fa[j][i-1]][i-1]);
		}
	}
	for(int i=1;i<=p;i++)
	{
		int tmp=LCA(A[i].x,A[i].y);
		if(tmp==INT_MAX)
			cout<<-1<<endl;
		else cout<<tmp<<endl;
	}
}
void init(){
	freopen("truck.in","r",stdin);
	freopen("truck.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
		cin>>V[i].x>>V[i].y>>V[i].v;
	cin>>p;
	for(int i=1;i<=p;i++)
		cin>>A[i].x>>A[i].y;
	kt=(int)(log((double)n)/log(2.0))+1;
}
int main(){
	init();
	work();
	return 0;
}
/*
4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
*/