1 条题解
-
0
#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
- 上传者