zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    2014-11-24 作业
    数据库查询基本部分
    SQL备份还原,分离附加
    SQL基础2
    SQL基础,与数据类型;
    if语句解一元二次方程~
    用C语言计算圆的面积~!!!!!!!
    C语言基础
    数据导出和TreeView
    MDI窗体容器和权限设置
  • 原文地址:https://www.cnblogs.com/AT-HENS/p/7763713.html
Copyright © 2011-2022 走看看