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 }