20分求助,不知道错哪了
查看原帖
20分求助,不知道错哪了
735666
thinkerliu楼主2023/9/10 19:52
#include <bits/stdc++.h>

class Edge
{
public:
    int to;
    int dis;
    int next;
};

Edge edges[5050 * 2];
int  heads[5050];
int  dis[5050]; // dis[i] (dp[i]) 指经过节点 i 的最长链的长度

auto cnt = 0;
void add(int u, int v, int w)
{
    edges[++cnt].to = v;
    edges[cnt].next = heads[u];
    edges[cnt].dis  = w;
    heads[u]        = cnt;
}

int  deleted;
void dfs_d(int now, int parent)
{
    for (auto i = heads[now]; i; i = edges[i].next)
    {
        if (edges[i].to == deleted || edges[i].to == parent)
        {
            continue;
        }

        dis[edges[i].to] = dis[now] + edges[i].dis;

        dfs_d(edges[i].to, now);
    }
}

int n, u, v, w[5050];

int first, second;
int calc_d(int start)
{
    auto max_dis = 0;
    
    dfs_d(start, 0);
    for (auto i = 1; i <= n; i++)
    {
        if (max_dis < dis[i])
        {
            max_dis = dis[i];
            first = i;
        }
    }

    memset(dis, 0, sizeof(dis));
    max_dis = 0;

    dfs_d(first, 0);
    for (auto i = 1; i <= n; i++)
    {
        if (max_dis < dis[i])
        {
            max_dis = dis[i];
            second  = i;
        }
    }

    return max_dis;
}

int dis1[5050], dis2[5050];
int calc_r(int start)
{
    memset(dis1, 0, sizeof(dis1));
    memset(dis2, 0, sizeof(dis2));

    auto max_dis2 = 0;
    auto first2 = start, second2 = 0, cnt1 = 0, cnt2 = 0;

    max_dis2 = 0;
    memset(dis, 0, sizeof(dis));
    dfs(first2, 0);
    for (auto i = 1; i <= n; i++)
    {
        if (max_dis2 < dis[i])
        {
            max_dis2 = dis[i];
            second2  = i;
        }

        if (dis[i])
        {
            dis1[++cnt1] = dis[i];
        }
    }

    max_dis2 = 0;
    memset(dis, 0, sizeof(dis));
    dfs(second2, 0);
    for (auto i = 1; i <= n; i++)
    {
        if (max_dis2 < dis[i])
        {
            max_dis2 = dis[i];
        }

        if (dis[i])
        {
            dis2[++cnt2] = dis[i];
        }
    }

    auto idx = 0, max = 99999999;
    for (auto i = 1; i <= n; i++)
    {
        if (dis1[i] && dis2[i])
        {
            if (max > std::max(dis1[i], dis2[i]))
            {
                max = std::max(dis1[i], dis2[i]);
                idx = i;
            }
        }
    }

    return std::max(dis1[idx], dis2[idx]);
}

int main()
{
    std::cin >> n;
    for (auto i = 1; i < n; i++)
    {
        std::cin >> u >> v >> w[i];

        add(u, v, w[i]);
        add(v, u, w[i]);
    }

    auto ans = calc_d(1);
    for (auto i = 1; i < n; i++)
    {
        deleted = i;
        auto d1 = calc_d(first);
        auto d2 = calc_d(second);
        ans     = std::min(ans, std::max({calc_r(first) + calc_r(second) + w[i], d1, d2}));
    }

    std::cout << ans << std::endl;

    return 0;
}
2023/9/10 19:52
加载中...