Codeforces 34C Page Numbers(簡單圖論+DFS)
There are n cities in Berland. Each city has its index — an integer number from 1 to n.
The capital has index r1.
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
Once the king of Berland Berl XXXIV decided to move the capital from city r1 to city r2. 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.
The first line contains three space-separated integers n, r1, r2 (2 ≤ n ≤ 5·104, 1 ≤ r1 ≠ r2 ≤ n) — amount of cities in Berland, index of the old capital and index of the new one, correspondingly.
The following line contains n - 1 space-separated integers — the old representation of the road map. For each city, apart from r
Output n - 1 numbers — new representation of the road map in the same format.
Sample test(s) input3 2 3 2 2output
2 3input
6 2 4 6 1 2 4 2output
6 4 1 4 2
題意:很不好理解,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;
}