1 条题解

  • 0
    @ 2026-1-27 19:25:55
    #include<bits/stdc++.h>
    using namespace std;
    
    vector<int> family[110];  // [1] 邻接表,存储树的边(无向),family[a]表示与节点a相连的所有节点
    
    // 深度优先遍历函数(优先访问小编号子节点)
    // a: 当前遍历的节点;b: 当前节点的父节点(避免回头遍历)
    void dfs(int a,int b){
        cout<<a<<endl;  // [2] 访问当前节点,输出节点编号
        // 遍历当前节点a的所有邻接节点(已排序,保证小编号子节点优先访问)
        for(int i=0;i<family[a].size();i++){
            int r = family[a][i];  // [3] 取出邻接节点r
            if(r != b){            // [4] 跳过父节点b,避免递归回到父节点
                dfs(r, a);         // [5] 递归遍历子节点r,父节点为当前节点a
            }
        }
    }
    
    int main(){
        int n;                   // [6] n-树的节点总数(编号1~n)
        cin>>n;
        int a,b;
        // 读入n-1条无向边,构建邻接表
        for(int i=1;i<n;i++){
            cin>>a>>b;
            family[a].push_back(b);  // [7] 把b加入a的邻接列表
            family[b].push_back(a);  // [8] 把a加入b的邻接列表(因为树是无向的)
        }
        // 对每个节点的邻接列表进行升序排序,保证子节点按小编号优先访问
        for(int i=1;i<=n;i++){
            sort(family[i].begin(),family[i].end());  // [9] 排序后,子节点会按从小到大的顺序被遍历
        }
        dfs(1,0);  // [10] 从根节点1开始深度优先遍历,父节点为0(表示无父节点)
        return 0;
    }
    
    • 1

    信息

    ID
    1068
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    1
    已通过
    1
    上传者