D. Road Maptime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard output
Cities in Berland. Each city has its index-an integer number from to n. The capital has index r. All the roads in Berland are two-way. the road system is such that there is exactly one path from the capital to each city, I. e. the road map looks like a tree. in Berland's chronicles the road map is kept in the following way: for each city I, Different from the capital, there is kept number pI-Index of the last city on the way from the capital to I.
To city r. Naturally, after this old representation of the road map in Berland's chronicles became incorrect. Please, help the king find out a new representation of the road map in the way described above.
Input
, R, R(NLimit ≤ limit 5 · 10, limit 1 limit ≤ limitR =RLimit ≤ limitN)-Amount of cities in Berland, index of the old capital and index of the new one, correspondingly.
Container-Progress 1 space-separated integers-the old representation of the road map. For each city, apart from r, There is given integer pI-Index of the last city on the way from the capital to city I. All the cities are described in order of increasing indexes.
Output
Parameter-percent 1 numbers-new representation of the road map in the same format.
Sample test (s) input
OutputInputOutputIt is hard to understand. n cities numbered 1-n are now migrating from the capital r1 to the Capital r2. Before the migration, there is a map indicating the country, each vertex corresponds to its precursor, and the capital does not skip the precursor. Ask about the map representation method after migration. A graph must be a spanning tree (n-1 edges)
Idea: each vertex is connected to the frontend to form a graph. Traverse from the new capital and record the answer during the traversal process.
Code:
#include <stdio.h>#include <string.h>#include <algorithm>#include <vector>using namespace std;const int N = 100005;int n, r1, r2, sb;vector<int> g[N];int du[N], i;int vis[N];int ans[N];void dfs(int now) {vis[now] = 1;for (int i = 0; i < g[now].size(); i++) {int v = g[now][i];if (vis[v]) continue;ans[v] = now;dfs(v);}}int main() {memset(vis, 0, sizeof(vis));memset(du, 0, sizeof(du));memset(g, 0, sizeof(g));scanf("%d%d%d", &n, &r1, &r2);for (i = 1; i <= n; i++) {if (i == r1) continue;scanf("%d", &sb);g[i].push_back(sb);g[sb].push_back(i);du[i]++; du[sb]++;}dfs(r2);int bo = 0;for (i = 1; i <= n; i++) {if (i == r2) continue;if (bo++) printf(" ");printf("%d", ans[i]);}printf("\n");return 0;}