简单树上问题->树的直径

2次dfs solutions, 仅限边权为非负,或者没有边权(边权为1):

void solve(){
    int n;
    cin >> n;
    
    vector<vector<pair<int, int>>> al(n + 1);
    for (int i = 0; i < n - 1; ++i){
        int u, v, w;
        cin >> u >> v >> w;
        al[u].emplace_back(v, w);
        al[v].emplace_back(u, w);
    }
    
    vector<int> dist(n + 1);
    
    function<void(int, int, int)> dfs = [&](int u, int p, int d){
        dist[u] = d;
        for (const auto& [v, w] : al[u]){
            if (v != p){
                dfs(v, u, d + w);
            }
        }
    };
    
    int now = 1;
    dfs(now, 0, 0);
    
    now = max_element(dist.begin(), dist.end()) - dist.begin();
    
    dfs(now, 0, 0);
    
    cout << *max_element(dist.begin(),dist.end()) << '\n';
}

1次dfs,树上dp(可以找到直径但是找不到路径)

void solve(){
    int n;
    cin >> n;

    vector<vector<pair<int, int>>> al(n + 1);
    for (int i = 0; i < n - 1; ++i){
        int u, v, w;
        cin >> u >> v >> w;
        al[u].emplace_back(v, w);
        al[v].emplace_back(u, w);
    }

    vector<int> dp(n + 1);

    int ans = 0;
    function<void(int, int)> dfs = [&](int u, int p){
        for (const auto& [v, w] : al[u]){
            if (v != p){
                dfs(v, u);
            }
            ans = max(ans, dp[u] + dp[v] + w);
            dp[u] = max(dp[u], dp[v] + w);

        }
    };

    dfs(1, 0);

    cout << ans << '\n';
}
posted @ 2024-01-12 10:14  _Yxc  阅读(3)  评论(0编辑  收藏  举报