记录编号 115332 评测结果 AAAAAAAAAA
题目名称 [NOIP 2007]树网的核 最终得分 100
用户昵称 Gravatar任杰 是否通过 通过
代码语言 C++ 运行时间 0.103 s
提交时间 2014-08-18 10:10:51 内存使用 1.34 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define MAX_N 300
#define INF 9999999

int n,S;
int map[MAX_N][MAX_N];
int d[MAX_N][MAX_N];
int path[MAX_N][MAX_N];
int linepath[MAX_N];
int linecnt=0;
bool used[MAX_N];

void GetLinePath(int s,int v)
{
	if(path[s][v]!=-1)
	{
		GetLinePath(s,path[s][v]);
		linepath[linecnt++]=path[s][v];
		GetLinePath(path[s][v],v);

	}
}

int GetECC(int b,int e)
{
	int maxx=0;
	int minx;

	memset(used,0,sizeof(used));
	for(int i=b;i<=e;i++)
	{
		used[linepath[i]]=true;
	}
	for(int i=0;i<n;i++)
	{
		if(!used[i])
		{
			minx=INF;
			for(int j=b;j<=e;j++)
			{
				minx=min(minx,d[i][linepath[j]]);
			}
			maxx=max(maxx,minx);
		}
	}

	return maxx;
}

int main()
{
	freopen("core.in","r",stdin);
	freopen("core.out","w",stdout);

	scanf("%d%d",&n,&S);

	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			d[i][j]=INF;
		}
		d[i][i]=0;
	}

	for(int i=0;i<n-1;i++)
	{
		int a,b,v;
		scanf("%d%d%d",&a,&b,&v);
		a--;b--;
		map[a][b]=v;
		map[b][a]=v;
		d[a][b]=v;
		d[b][a]=v;
		path[a][b]=-1;
		path[b][a]=-1;
	}

	for(int k=0;k<n;k++)
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{

				if(d[i][j]>d[i][k]+d[k][j])
				{
					d[i][j]=d[i][k]+d[k][j];
					path[i][j]=k;
				}
			}
		}
	}

	int s,t;
	int maxx=0;

	for(int i=0;i<n;i++)
	{
		if(maxx<d[0][i])
		{
			maxx=d[0][i];
			s=i;
		}
	}

	maxx=0;
	for(int i=0;i<n;i++)
	{
		if(maxx<d[s][i])
		{
			maxx=d[s][i];
			t=i;
		}
	}

	linepath[linecnt++]=s;
	GetLinePath(s,t);
	linepath[linecnt++]=t;

	int minx=INF;
	for(int size=1;size<=linecnt;size++)
	{
		for(int b=0;b+size<=linecnt;b++) if(d[linepath[b]][linepath[b+size-1]]<=S)
		{
			minx=min(minx,GetECC(b,b+size-1));
		}
	}

	printf("%d\n",minx);

	return 0;
}