题目链接:Problem - 34D - Codeforces
题目大意:
给你一个树,更换根节点输出每个节点最进的父节点
题目思路:
按要求建树,遇到原根节点continue,然后dfs标记ans,for循环输出ans,continue新的根节点
C++代码:
#include<bits/stdc++.h>
using namespace std;
using i64=int64_t;
using i128=__int128_t;
#define inf 0x3f3f3f3f
#define quick std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);
typedef pair<i64,i64> PII;
typedef long long ll;
typedef unsigned long long ull;
#define fi first
#define se second
#define N 100010
#define M 998244353
// 998244353 1000000007 1073741824
// 无序map unordered_map
int n,r1,r2;
int a[N],ans[N];
vector<int> tr[N];
void dfs(int u,int fa){
ans[u]=fa;
for(int i=0;i<tr[u].size();i++){
if(tr[u][i]==fa)continue;
dfs(tr[u][i],u);
}
}
void solve(){
cin>>n>>r1>>r2;
for(int i=1;i<=n;i++){
// r1是根节点
if(i==r1)continue;
cin>>a[i];
}
// 建图
for(int i=1;i<=n;i++){
if(i==r1)continue;
tr[i].push_back(a[i]);
tr[a[i]].push_back(i);
}
dfs(r2,-1);
for(int i=1;i<=n;i++){
if(ans[i]==-1)continue;
// if(i==r2)continue;// 两种写法一样
cout<<ans[i]<<" ";
}cout<<endl;
}
int main(){ quick
int t=1;
// cin>>t;
while(t--){
solve();
}
system("pause");
return 0;
}