NOIP2007——树网的核

题中要求树网的核在直径上,但其实不用找直径,因为最优解一定在直径上,所以题中的限制条件就不用管了,多条直径找着麻烦,不如枚举,取最小即可。


 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <cmath>
 6 #define LL long long 
 7 using namespace std;
 8 template <class _T> inline void read(_T &_x) {
 9     int _t; bool _flag=false;
10     while((_t=getchar())!='-'&&(_t<'0'||_t>'9')) ;
11     if(_t=='-') _flag=true,_t=getchar(); _x=_t-'0';
12     while((_t=getchar())>='0'&&_t<='9') _x=_x*10+_t-'0';
13     if(_flag) _x=-_x;
14 }
15 const int maxn=305;
16 const int inf=0x3f3f3f3f;
17 int n,s,x,y,z,dis[maxn][maxn],ans=inf;
18 int main(){
19     memset(dis,63,sizeof dis);
20     read(n);read(s);
21     for(int i=1;i<n;i++){
22         read(x),read(y),read(z);
23         dis[x][y]=dis[y][x]=z;
24     }
25     for(int k=1;k<=n;++k)
26         for(int i=1;i<=n;++i)
27             for(int j=1;j<=n;++j)
28                 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
29     int t;
30     for(int i=1;i<=n;++i){
31         for(int j=1;j<=n;++j){
32             dis[i][i]=0;
33             if(dis[i][j]>s)continue;
34             t=0;
35             for(int k=1;k<=n;++k){
36                 t=max(t,(dis[k][i]+dis[k][j]-dis[i][j])/2);
37             }
38             ans=min(ans,t);
39         }
40     }
41     printf("%d",ans);
42     return 0;
43 }

 

posted @ 2017-10-31 21:07  _ATHENS  阅读(189)  评论(0编辑  收藏  举报