记录编号 158680 评测结果 AAAAAAAAAA
题目名称 [NOIP 2013]货车运输 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 1.731 s
提交时间 2015-04-16 20:19:22 内存使用 12.66 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<deque>
using namespace std;
class miku
{
public:
	int to;int lo;
};
deque<miku> in[50001],bt[10001];
class miku2
{
public:
	int wi,num;
};
deque<miku2>  p[30001];
class miku3
{
public:
	int t1,t2,num;
};
deque<miku3> dark;
int cnt=0;
int n,m,root[10001]={0},co[10001]={0},q,ans[30001]={0},f[10001],be[10001]={0};
int dfs(int i,int k)
{
	deque<int> q;
	int v=9999999,to=0,fr=0;
	q.push_back(i);
	//cout<<1<<endl;
	do
	{
		v=0,to=0,fr=0;
		for(int j=0;j<q.size();j++)
		{
			int x=q[j];
			for(int p=0;p<in[x].size();p++)
			{
				miku u=in[x][p];
				if(co[u.to]==0&&u.lo>v)
				{
					v=u.lo;to=u.to;fr=x;
				}
			}
		}
		if(to!=0)
		{
			//cout<<co[to]<<endl;
			miku x;
			x.to=to,x.lo=v;
			bt[fr].push_back(x);
			q.push_back(to);
			co[to]=k;
			root[to]=i;
		}
	}while(to!=0);
	return 0;
}
int set(int i)
{
	f[i]=i;return 0;
}
int link(int i,int j)
{
	f[j]=f[i];
	return 0;
}
int find(int x)
{
	int t=f[x];
	if(f[x]!=x)
	{
		f[x]=find(f[x]);
		if(be[t]!=0)
			be[x]=min(be[t],be[x]);
	}
	return f[x];
}
int check()
{
	for(int i=1;i<=n;i++)
	{
		cout<<i<<" "<<f[i]<<endl;
	}
	return 0;
}
int lca(int r)
{
	for(int i=0;i<bt[r].size();i++)
	{
		miku x=bt[r][i];
		lca(x.to);
    }
	set(r);
	for(int i=0;i<bt[r].size();i++)
	{
		link(r,find(bt[r][i].to));
		
		//cout<<bt[r][i].to<<endl;
		if(be[bt[r][i].to]==0)
		be[bt[r][i].to]=bt[r][i].lo;
		else
			be[bt[r][i].to]=min(be[bt[r][i].to],bt[r][i].lo);
	}
	int t=p[r].size();
	while(t>0)
	{
		miku2 w=p[r].front();
		p[r].pop_front();
		if(f[w.wi]!=0)
		{
			miku3 x;
			x.t1=r;x.t2=w.wi;x.num=w.num;
			dark.push_back(x);
		}
		else
			p[r].push_back(w);
			t--;
	}
	//check();
	t=dark.size();
	while(t>0)
	{
		miku3 x=dark.front();
		dark.pop_front();
		//cout<<r<<" "<<x.t1<<" "<<x.t2<<" "<<x.num<<" "<<be[x.t1]<<" "<<be[x.t2]<<endl;
		if(find(x.t1)==find(x.t2))
		{
			//cout<<r<<" "<<x.t1<<" "<<x.t2<<" "<<x.num<<" "<<be[x.t1]<<" "<<be[x.t2]<<endl;
			//check();
			ans[x.num]=min(be[x.t1],be[x.t2]);
		
		if(ans[x.num]==0) ans[x.num]=max(be[x.t1],be[x.t2]);
		}
		else
			dark.push_back(x);
			t--;
	}
	return 0;
}
int bcs()
{
	for(int i=1;i<=n;i++)
	{
		if(co[i]==0)
		{
			cnt++;
			co[i]=cnt;
			dfs(i,cnt);
			root[i]=i;
		}
	}
	return 0;
}
int main()
{
	freopen("truck.in","r",stdin);
	freopen("truck.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		miku x;
		x.to=b;x.lo=c;
		in[a].push_back(x);
		x.to=a;
		in[b].push_back(x);
	}
	bcs();
	scanf("%d",&q);
	for(int i=1;i<=q;i++)
	{
		int t1,t2;
		scanf("%d%d",&t1,&t2);
		if(co[t1]!=co[t2])
			ans[i]=-1;
		else
		{
		miku2 x;
		x.wi=t2;x.num=i;p[t1].push_back(x);
		x.wi=t1;p[t2].push_back(x);
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(f[i]==0)
			lca(root[i]);
	}
	//for(int i=1;i<=n;i++)
	//{
	//	cout<<i<<" "<<endl;
	//	for(int j=0;j<bt[i].size();j++)
	//		cout<<bt[i][j].to<<" ";
	//	cout<<endl;
	//}
	//printf("%d",dark.size());
	for(int i=1;i<=q;i++)
	printf("%d\n",ans[i]);
	return 0;
}