上山打老虎 发表于 2021-7-27 13:40:05

P1099 树网的核

woc,这题就这么A了?(不敢相信)
题意:定义树核为树上最长链上的一段(长度不超过s)(也可以是一个点)
定义偏心距为到树核最远的距离,求最小偏心距
woc纯暴力居然过了
Floyd+爆搜
先找到最长链(可能不只一条)
枚举起点终点,暴力找最远距离
一遍过666
n<=300
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;#define olinr return#define love_nmr 0
int f;
int n;
int s;
int maxn;
int fa;
bool flag;
bool vis;
int ans=0x7fffffff;
vector<int>G;
int tot;
inline void Floyd()
{
    for(int i=1;i<=n;i++)
      f=0;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                f=min(f+f,f);
}
inline void dfs(int x,int goal,int fat)
{
    if(x==goal)
    {
      flag=true;
      fa=fat;
      return;
    }
    int siz=G.size();
    for(int i=0;i<siz;i++)
    {
      int go=G;
      if(go!=fat)
            dfs(go,goal,x);
      if(flag)
      {
            fa=fat;
            return;
      }
    }
}
inline void dfss(int x,int dis,int fa)
{
    tot=max(tot,dis);
    if(dis>=ans) return;
    int siz=G.size();
    for(int i=0;i<siz;i++)
    {
      int go=G;
      if(!vis&&go!=fa)
            dfss(go,dis+f,x);
    }
}
inline void cl(int x,int y)
{
    memset(fa,0,sizeof fa);
    flag=0;
    dfs(x,y,0);
    int start=y;
    while(5201314)
    {   
      tot=0;
      memset(vis,0,sizeof vis);
      int end=start;
      vis=true;
      int dis=0;
      while(1314520)
      {   
            if(!fa) break;
            if(dis+f]>s) break;
            dis+=f];
            end=fa;
            vis=true;
      }
      if(start==end)
      {
            for(int i=1;i<=n;i++)
                tot=max(tot,f);
      }
      else
      {
            int teme=start;
            while(teme)
            {
                dfss(teme,0,0);
                if(teme==end) break;
                teme=fa;
            }
      }
      ans=min(ans,tot);
      start=fa;
      if(!start)break;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>s;
    memset(f,0x3f,sizeof f);
    for(int a,b,c,i=1;i<n;i++)
    {
      cin>>a>>b>>c;
      f=f=c;
      G.push_back(b);
      G.push_back(a);
    }
    Floyd();
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
            maxn=max(maxn,f);
    for(int i=1;i<=n;i++)
      for(int j=i+1;j<=n;j++)
            if(f==maxn)
                cl(i,j);
    cout<<ans<<endl;olinr love_nmr;
}
----olinr


文档来源:51CTO技术博客https://blog.51cto.com/u_15314204/3190981
页: [1]
查看完整版本: P1099 树网的核