记录编号 |
115332 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2007]树网的核 |
最终得分 |
100 |
用户昵称 |
任杰 |
是否通过 |
通过 |
代码语言 |
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;
}