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 the 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 (n ≤ 5·10, 1 ≤ r ≠ r ≤ n) — amount of cities in Berland, index of the old capital and index of the new one, correspondingly.
- 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
- 1 numbers — new representation of the road map in the same format.
Sample test(s)input
outputinputoutput題意:很不好理解,n個城市編號1-n,現在要從首都r1遷徙到首都r2,遷徙前有一個表示國家的地圖,地圖的表示方法為,每個點對應的是他的前驅,首都無前驅跳過,問遷徙後的地圖表示方法。圖必然是一棵產生樹(n-1條邊)
思路:每個點對應前驅相連,這樣就能構成圖了,在從新的首都往後遍曆,遍曆過程中記錄下答案。
代碼:
#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;}