记录编号 315118 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2015]运输计划 最终得分 100
用户昵称 Gravatar面对疾风吧 疾风 疾风吧 是否通过 通过
代码语言 C++ 运行时间 1.579 s
提交时间 2016-10-04 18:54:47 内存使用 23.21 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 300010
using namespace std;
struct Edge{
	int t,next,d;
}e[maxn<<1];int len,head[maxn];
struct Que{
	int x,y,len;
}q[maxn];
int n,m,dis[maxn],cnt,d[maxn],l,r;
int ufs[maxn],pos[maxn],id[maxn],v[maxn],son[maxn],size[maxn],depth[maxn],top[maxn];
void _addedge(int x,int y,int z){
	len++;
	e[len].t=y;
	e[len].d=z;
	e[len].next=head[x];
	head[x]=len;
}
void _dfs1(int x){
	size[x]=1;
	for(int i=head[x];i;i=e[i].next){
		int y=e[i].t;
		if(ufs[x]==y)continue;
		ufs[y]=x;
		depth[y]=depth[x]+1;
		dis[y]=dis[x]+e[i].d;
		v[y]=e[i].d;
		_dfs1(y);
		size[x]+=size[y];
		if(size[y]>size[ son[x] ])son[x]=y;
	}
}
void _dfs2(int x,int tp){
	top[x]=tp;
	pos[++cnt]=x;
	id[x]=cnt;
	if(son[x])_dfs2(son[x],tp);
	for(int i=head[x];i;i=e[i].next){
		int y=e[i].t;
		if(ufs[x]==y||y==son[x])continue;
		_dfs2(y,y);
	}
}
int get_lca(int x,int y){
	int tx=top[x],ty=top[y];
	while(tx!=ty){
		if(depth[tx]<depth[ty]){swap(x,y);swap(tx,ty);}
		x=ufs[tx];tx=top[x];
	}
	if(depth[x]>depth[y])swap(x,y);
	return x;
}
void _setwork(int l,int r){
	d[l]++;d[r+1]--;
}
void get_set(int x,int y){
	int tx=top[x],ty=top[y];
	while(tx!=ty){
		if(depth[tx]<depth[ty]){swap(tx,ty);swap(x,y);}
		_setwork(id[tx],id[x]);
		x=ufs[tx];tx=top[x];
	}
	if(depth[x]>depth[y])swap(x,y);
	if(id[x]+1<=id[y])_setwork(id[x]+1,id[y]);
}
bool _check(int mid){
	memset(d,0,sizeof(d));
	int num=0,sum=0,Max=0;
	for(int i=1;i<=m;i++){
		if(q[i].len>mid){
			get_set(q[i].x,q[i].y);
			num++;
			Max=max(Max,q[i].len);
		}		
	}
	if(!num)return 1;
	for(int i=1;i<=n;i++){
		sum+=d[i];
		if(sum>=num){
			int x=v[ pos[i] ];
			if(Max-x<=mid)return 1;
		}
	}
	return 0;
}
int _search(){
	while(l<=r){
		int mid=(l+r)>>1;
		if(_check(mid))r=mid-1;
		else l=mid+1;
	}
	return l;
}
int main(){
	freopen("transport.in","r",stdin);freopen("transport.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<n;i++){
		int x,y,z;scanf("%d%d%d",&x,&y,&z);
		_addedge(x,y,z);_addedge(y,x,z);
	}
	depth[1]=1;
	_dfs1(1);
	_dfs2(1,1);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&q[i].x,&q[i].y);
		int rt=get_lca(q[i].x,q[i].y);
		q[i].len=dis[ q[i].x]+dis[ q[i].y ]-2*dis[rt];
		r=max(r,q[i].len);
	}
	printf("%d\n",_search());
	fclose(stdin);fclose(stdout);
}