nyoj ACM 吝嗇的國度(bfs)

2021-07-29 18:39:13 字數 1430 閱讀 2582

吝嗇的國度

時間限制: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 9

1 8

8 10

10 3

8 6

1 2

10 4

9 5

3 7

樣例輸出

-1 1 10 10 9 8 3 1 1 8

思路:

求前驅節點 , 或者 求最小步數 , 考慮 bfs 廣度優先搜尋

此地用 鄰接鍊錶儲存圖。

用 隊 列 實現 bfs,沒出乙個節點,判斷其以前有沒有將他的子節點都儲存到佇列中了(根據flag),如果有,則直接pop(),並跳過改點,否則將其子節點都push()到佇列中去。

鄰接鍊錶的頭指標都儲存在乙個陣列中,陣列型別為struct head。其中f儲存自己的前驅節點,flag表示自己之前是否被訪問過,p為指標。

#include

#include

struct node;

struct head;

void init(int* a);

void push(int* a,int s);

int pop(int* a);

int main()

for(j=1;j<=n-1;j++)

h[s].f=-1;

init(a);

push(a,s);

k=pop(a);

while(k!=-1)

h[k].flag=1;

q=h[k].p;

while(q!=null)

q=q->p;

}k=pop(a);

}for(j=1;j<=n;j++)

printf("\n");

}return0;}

void init(int* a)

void push(int* a,int s)

int pop(int* a)

吝嗇的國度

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

吝嗇的國度

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

吝嗇的國度

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