求树的重心 但是60分 后两个wa求助!!!
查看原帖
求树的重心 但是60分 后两个wa求助!!!
806111
jiangzaicai楼主2023/11/23 21:43
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 200010;
int n,m;
ll out[N];
vector<ll>g[N];
bool vis[N];
ll dist[N];
ll flag = 1e18;
ll ans = 1e18;
ll f[N];
ll w[N];
void add_edge(ll a,ll b)
{
    g[a].push_back(b);
}
ll dfs1(int u) //以u为根的子树的总节点数
{
    vis[u] = true;
    int res = 0;
    int sum = 1; //返回值
    for(int i = 0 ; i < g[u].size() ; i++)
    {
        if(!vis[g[u][i]])
        {
            int s =dfs1(g[u][i]);
            res = max(res,s);
            sum+=s; //
        }
    }
    res = max(res,n - sum);
    f[u]=res;
    return sum;
}
void dfs(ll u)
{
   vis[u] = true;
   ll res = 0;
   for(ll i = 0 ; i < g[u].size() ; i++)
   {

       ll t = g[u][i];
       if(!vis[t])
       {
           dist[t] = dist[u] + 1 ;
           dfs(t);
       }
   }
}
int main()
{
    cin>>n;
    for(ll i = 1 ; i <= n ; i++)
    {
       ll x,y;
         cin>>w[i]>>x>>y;
         if(x!=0) {
             add_edge(i, x);
             add_edge(x, i);
         }
         if(y!=0) {
             add_edge(y, i);
             add_edge(i, y);
         }
    }
    ll maxn = -1;
    dfs1(1);
    ll kk = 1 ;
    for(int i = n ; i >= 1  ; i--)
    {
        if(flag >= f[i])
        {
            flag = f[i];
            kk = i;
        }
    }
    memset(vis,0,sizeof(vis));
    dfs(kk);
    ll sum = 0;
    for(ll i = 1 ; i <= n ; i++)
    {
//        cout<<dist[i]<<"\n";
        if(i!=kk)
            sum+=(ll)w[i]*dist[i];
    }
    cout<<sum;
    return 0;
}
2023/11/23 21:43
加载中...