吝嗇的國度 NYOJ 20(深搜 廣搜)

2021-08-20 08:38:11 字數 1443 閱讀 3927

時間限制:

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

**經典題目

上傳者張云聰

大半年前看著題的時候還不會寫,當時是因為不會鄰接表,現在再來看這題感覺好簡單啊,n個城市由n-1條路連線起來,那麼這就是一顆最小生成樹了(暫且先這樣說),那麼每個點的父親節點都只有乙個(只要有的話),那麼這題就好辦,遍歷所有的節點,把他的父親節點存起來最後輸出即可。

//bfs

#include#include#include#include#includeusing namespace std;

#define inf 0x3f3f3f3f

const int n=100010;

int tot,head[n],n,s,ans[n];

bool vis[n];

struct node

e[n*2];

void add(int a,int b)

void bfs()}}

for(int i=1;i<=n;i++)

printf(i==n?"%d\n":"%d ",ans[i]);

}int main()

e[n*2];

void add(int a,int b)

void dfs(int u)

}}int main()

{ int a,b,t;

scanf("%d",&t);

while(t--)

{tot=0;

memset(head,-1,sizeof(head));

memset(vis,false,sizeof(vis));

scanf("%d%d",&n,&s);

for(int i=1;i

NYOJ 20 吝嗇的國度 深搜

描述在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入 第一行輸入乙個整數m表示測試資料共有m 1 m 5 組 每組測試資料的第一行輸入...

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號城市。必須經過的前乙個城市是幾號城市 如果你不走反覆的路 輸入 第一行...