记录编号 364493 评测结果 AAAAAAAAAAAAAAAAAAAAA
题目名称 [SPOJ 1825] 免费旅行II 最终得分 100
用户昵称 Gravatar哒哒哒哒哒! 是否通过 通过
代码语言 C++ 运行时间 4.563 s
提交时间 2017-01-16 19:54:18 内存使用 11.98 MiB
显示代码纯文本
#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long 
int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
	return x*f;
}
const int maxn=201000;
struct edge{int to,next,dis;}e[maxn*2];
int tot,head[maxn];
void add(int u,int  v,int w){
	e[++tot].to=v;
	e[tot].dis=w;
	e[tot].next=head[u];
	head[u]=tot;
}
int size[maxn],f[maxn],root;
int n,cnt,m,k,ans,c[maxn];
int max_s[maxn],d[maxn],dis[maxn];
int q[maxn],mx,t[maxn];
bool vis[maxn];
#define to e[i].to
void get_root(int u,int fa){
	f[u]=0,size[u]=1;
	for(int i=head[u];i;i=e[i].next){
		if(to==fa||vis[to])continue;
		get_root(to,u);
		size[u]+=size[to];
		f[u]=max(f[u],size[to]);
	}
	f[u]=max(f[u],cnt-size[u]);
	if(!root || f[u]<f[root]) root=u;
}
void get_deep(int u,int fa,int rt){
	max_s[rt]=max(max_s[rt],d[u]);
	for(int i=head[u];i;i=e[i].next){
		if(to==fa||vis[to])continue;
		d[to]=d[u]+c[to];
		dis[to]=dis[u]+e[i].dis;
		get_deep(to,u,rt);
	}
}
void calc(int u,int fa,int rt){
	if(!c[rt]&&d[u]<=k){
		if(k-d[u]<=mx)ans=max(ans,t[k-d[u]]+dis[u]);
		else ans=max(ans,t[mx]+dis[u]);
	}else if(c[rt]&&d[u]<k){
		if(k-1-d[u]<=mx)ans=max(ans,t[k-1-d[u]]+dis[u]);
		else ans=max(ans,t[mx]+dis[u]);
	}
	for(int i=head[u];i;i=e[i].next)
		if(to!=fa&&!vis[to]) calc(to,u,rt);
}
void add2(int u,int fa,int flag){
	if(d[u]<=k){
		if(flag) t[d[u]]=max(t[d[u]],dis[u]);
		else t[d[u]]=0;
	}
	for(int i=head[u];i;i=e[i].next)
		if(to!=fa&&!vis[to])add2(to,u,flag);
}
bool cmp(int a,int b){return max_s[a]<max_s[b];}
void dfs(int u){
	vis[u]=1;int res=0;
	for(int i=head[u];i;i=e[i].next){
		if(vis[to])continue;
		d[to]=c[to],dis[to]=e[i].dis;
		get_deep(to,0,to),q[++res]=to;
	}
	sort(q+1,q+res+1,cmp);
	for(int i=1;i<=res;i++){
		calc(q[i],0,u);add2(q[i],0,1);
		mx=min(max_s[q[i]],k);
		for(int j=1;j<=mx;j++)t[j]=max(t[j],t[j-1]);
	}
	for(int i=1;i<=res;i++){
		add2(q[i],0,0);
		for(int j=1;j<=min(k,max_s[q[i]]);j++)t[j]=0;
	}
	for(int i=head[u];i;i=e[i].next){
		if(vis[to])continue;
		cnt=size[to],root=0;
		get_root(to,0);dfs(root);
	}
}
int main(){
	freopen("freetourII.in","r",stdin);freopen("freetourII.out","w",stdout);
	cnt=n=read(),k=read(),m=read();
	for(int i=1,x;i<=m;i++)x=read(),c[x]=1;
	for(int i=1;i<n;i++){
		int a=read(),b=read(),c=read();
		add(a,b,c);add(b,a,c);
	}
	get_root(1,0);dfs(root);
	printf("%d\n",ans);	
	fclose(stdin);fclose(stdout);
	return 0;
}