問題描述:
在乙個吝嗇的國度裡有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
分析:
不難發現,如果乙個頂點v的度數為1,那麼經過它的上乙個城市必然是與它唯一相連的頂點u,這個結論雖然對解題沒有什麼太大的幫助,但是對於理解此題還是挺好的。
本題需要用dfs來解決。從起點開始進行深度搜尋,用乙個陣列pre來儲存每乙個搜尋到的頂點的父節點。因為題目要求是要求出經過乙個城市的上乙個城市,這樣的話,pre便能跟隨著dfs的探索進行每乙個城市的父節點的記錄,最後達到題目要求。
#include
#include
#include
using
namespace
std;
const
int maxn = 100000+10;
vector
v[maxn];//用vector實現鄰接鍊錶
int pre[maxn];//儲存父節點的編號
void dfs(int cur)
return ;
}int main()
for(int i=0;ifor(int j=0;jprintf("%d ",v[i][j]);
printf("\n");
}dfs(w);
for(int i=1;i<=n;i++)
}return
0; }
NYOJ 20 吝嗇的國度 DFS
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入第一行輸入乙個...
NYOJ 20 吝嗇的國度 DFS
吝嗇的國度 時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入 ...
nyoj20 吝嗇的國度(dfs)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入第一行輸入乙個...