nyoj20 吝嗇的國度

2021-06-18 22:18:21 字數 1311 閱讀 1208

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:3 描述

在乙個吝嗇的國度裡有n個城市,這n個城市間只有n-1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市(假設你不走重複的路)。

輸入第一行輸入乙個整數m表示測試資料共有m(1<=m<=5)組

每組測試資料的第一行輸入乙個正整數n(1<=n<=100000)和乙個正整數s(1<=s<=100000),n表示城市的總個數,s表示參觀者所在城市的編號

隨後的n-1行,每行有兩個正整數a,b(1<=a,b<=n),表示第a號城市和第b號城市之間有一條路連通。

輸出每組測試資料輸n個正整數,其中,第i個數表示從s走到i號城市,必須要經過的上乙個城市的編號。(其中i=s時,請輸出-1)

樣例輸入

1

10 1

1 91 8

8 10

10 3

8 61 2

10 4

9 53 7

樣例輸出

-1 1 10 10 9 8 3 1 1 8

解題思路:

1.實際是關於圖的題目,題目給出頂點的個數和邊數(頂點-1),然後去構造乙個圖

2.要求輸出當前頂點的上乙個頂點,如果隨便找乙個點遍歷得出的結果是錯誤的。

因為找到乙個點的prev不一定是主人公走的路,因此要在主人公所在的頂點開始遍歷

3.如何記錄當前頂點的前乙個頂點? 無論深搜還是廣搜每一次遍歷都是根據上一層的頂點向下遍歷

所以只要使用陣列儲存當前頂點的前驅就可以了,比如3的前乙個頂點為2,那麼prev[3] = 2

採用自定義鍊錶並結合深搜時間較短

使用printf和scanf以及自定義鍊錶

/*88ms*/

#include #include using namespace std;

struct node

;node *ver[100002];

int pre[100002];

char flag[100002];

int n, sx;

void ins(node* &head, int x)

void dfs(int x) }}

int main()}}

}*/void dfs(int v) }}

int main()

dfs(sx); // 從所在位置搜尋

//bfs();

pre[sx] = -1;

cout<

NYOJ 20 吝嗇的國度

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入第一行輸入乙個...

NYOJ 20 吝嗇的國度

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入第一行輸入乙個...

nyoj 20 吝嗇的國度

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入第一行輸入乙個...