2 条题解

  • 0
    @ 2026-1-28 14:50:55

    仔细想想,一颗真正有分叉的树怎么可能一笔画,所以只能是退化成一条链的树

    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
        int n; cin >> n;
        vector<int> d(n + 5);
        for(int i = 1; i < n; i ++){
            int u, v; cin >> u >> v;
            d[u] ++, d[v] ++;
        }
        if(n == 2)  cout << "1 2" << endl;
        else{
            vector<int> res;
            for(int i = 1; i <= n; i ++)
                if(d[i] == 1)   res.push_back(i);
                else if(d[i] != 2){
                    cout << -1 << endl;
                    return 0;
                }
            cout << res[0] << ' ' << res[1] << endl;
        }
    }
    
    • 0
      @ 2025-12-16 14:16:16

      图论

      简单路径不能经过一个点两次,因此如果一个点有 3 条或者更多条边,就一定会有走不到的边。

      因此这棵树一定会是一条链,那么我们只需要找到链的两个端点即可。

      如果你知道点的度数的话应该很容易想到:链端点(即树的叶子节点)的度数是为 1 的,非端点(非叶子节点)的度数为 2 。

      因此我们只要计算每个点的度数,答案就是度数为 1 的两个点(并且度数为 1 的点有且只有两个)。

      时间复杂度 O(n)O(n)

      #include<bits/stdc++.h>
      
      using namespace std;
      
      int main(){
          int n;
          cin >> n;
          vector<int> in(n + 1);
          for(int i = 1; i < n; i++){
              int u, v;
              cin >> u >> v;
              in[u]++;
              in[v]++;
          }
          vector<int> ans;
          for(int i = 1; i <= n; i++){
              if(in[i] == 1) ans.push_back(i);
              if(in[i] > 2){
                  cout << -1 << endl;
                  return 0;
              }
          }
          for(auto &i : ans){
              cout << i << " ";
          }
          cout << endl;
      }
      
      
      
      • 1

      信息

      ID
      158
      时间
      1000ms
      内存
      256MiB
      难度
      3
      标签
      递交数
      37
      已通过
      16
      上传者