NC54712. 吃桃
描述
输入描述
第一行:两个整数
接下来行:两个正整数,表示这两个节点有一条边相连。
,。
输出描述
若干行:每行一个整数表示牛妹依次经过的节点编号
示例1
输入:
7 3 1 2 2 6 2 3 3 4 3 5 5 7
输出:
3 2 1
C++14(g++5.4) 解法, 执行用时: 87ms, 内存消耗: 11208K, 提交时间: 2019-12-11 21:24:38
#include <bits/stdc++.h> using namespace std; #define pb push_back typedef long long ll; const int N=1e5+5; vector<int> p[N]; int nex[N],dep[N]; void dfs(int x,int f) { for (int y:p[x]){ if (y==f) continue; dfs(y,x); if (dep[x]<dep[y]+1){ dep[x]=dep[y]+1; nex[x]=y; }else if (dep[x]==dep[y]+1 && nex[x]>y){ nex[x]=y; } } } int main() { int n,k; scanf("%d%d",&n,&k); int t1,t2; for (int q=1;q<n;q++){ scanf("%d%d",&t1,&t2); p[t1].pb(t2); p[t2].pb(t1); } dfs(k,0); while (k!=0){ printf("%d\n",k); k=nex[k]; } return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 151ms, 内存消耗: 9408K, 提交时间: 2023-01-10 17:55:43
#include<bits/stdc++.h> using namespace std; const int N=100010; int n,k; int r[N],lt[N]; vector<int> v[N]; void dfs(int x,int fa) { for(int i=0;i<v[x].size();i++){ if(fa==v[x][i]) continue; dfs(v[x][i],x); if(r[x]<r[v[x][i]]+1){ r[x]=r[v[x][i]]+1; lt[x]=v[x][i]; } } } int main() { cin >> n >> k; int x,y; for(int i=1;i<n;i++){ cin >> x >> y; v[x].push_back(y); v[y].push_back(x); } dfs(k,0); while(k){ cout << k << endl; k=lt[k]; } }