Noip 2007 树网的核

来源:互联网 发布:客户流失数据 编辑:程序博客网 时间:2024/06/05 07:24
#include<cstdio>#include<cstring>using namespace std;#define inf 1000000000#define to e[i].v#define N 310struct node{int next,v,w;}e[N*2];int d,S,T,now,n,s,id,ans,f[N][N],g[N],v[N],head[N],ok;int read(){int x=0,f=1; char ch=getchar();for (;ch>'9' || ch<'0';ch=getchar()) if (ch=='-') f=-1;for (;ch>='0' && ch<='9';ch=getchar()) x=x*10+ch-'0';return x*f;}void add(int u,int v,int w) {e[id].v=v; e[id].w=w; e[id].next=head[u]; head[u]=id++;}int max(int a,int b) {return a>b? a:b;}int min(int a,int b) {return a>b? b:a;}void find(int num){ans=inf;for (int i=1;i<=num;i++){ int j;int res=0;for (j=i;j<=num;j++) if (f[g[i]][g[j]]>s) break;j--; memset(v,0,sizeof(v));for (int k=i;k<=j;k++) v[g[k]]=1;for (int k=1;k<=n;k++)if (!v[k]){now=inf;for (int l=i;l<=j;l++)now=min(now,f[k][g[l]]);res=max(res,now);}ans=min(ans,res);} }void get(int u,int fa,int num){if (ok) return;g[num]=u;if (u==T) {find(num);ok=1;return;}if (ok) return;for (int i=head[u];i;i=e[i].next)if (to^fa) get(to,u,num+1);}int main(){n=read(); s=read(); id=1;for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)if (i==j) f[i][j]=0; else f[i][j]=inf;for (int i=1;i<n;i++){int u=read(),v=read(),w=read();f[u][v]=f[v][u]=w; add(u,v,w); add(v,u,w);}for (int k=1;k<=n;k++)for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)f[i][j]=min(f[i][j],f[i][k]+f[k][j]);d=0;for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)if (f[i][j]>d) {d=f[i][j];S=i; T=j;}get(S,0,1);printf("%d",ans);return 0;}