解题思路

1.除了最长的路径,所有的路径均需要走两遍,使用转化思想,将问题转化为两遍路径(2 * (n - 1))-最长路径(step)即可;

代码

#include <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    while(cin >> n){
        unordered_map<int, vector<int>> f; //n-1条边无向连通图,不可能有环
        int u, v;
        for(int i = 0; i < n - 1; i++){
            cin >> u >> v;
            f[u].push_back(v);
            f[v].push_back(u);
        }
        queue<int> q;
        vector<bool> isVisited(n + 1);
        q.push(1);
        isVisited[1] = true;
        int curSize, step = -1;
        while(!q.empty()){ //除了最长的路径,所有的路径均需要走两遍 两遍路径(2 * (n - 1))-最长路径(step)
            curSize = q.size(); 
            step++;
            for(int i = 0; i < curSize; i++){
                int node = q.front();
                q.pop();
                if(f.count(node) == 0) continue;
                for(auto& e : f[node]){
                    if(isVisited[e]) continue;
                    q.push(e);
                    isVisited[e] = true;
                }
            }
        }
        cout << 2 * (n - 1) - step << endl;
    }
    return 0;
}