nyoj 20 吝嗇的國度 深搜

2021-07-04 02:15:20 字數 1812 閱讀 8533

時間限制:

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
解題思路:

一開始用了佇列來求,起點入隊,然後出隊,找到跟起點相連的城市進隊,那麼這些城市的前一步就是出隊的城市了,然後開始不停地出隊入隊,直到隊空為止。思路不錯,但是超時了。

經過看大神的**,發現這個題可以用深搜來解決,再一看題目發現這確實符合深搜的特性。

不管是佇列還是深搜,都需要標記。

佇列用到了#includestl函式,

#include #include using namespace std; //這幾個標頭檔案必不可少

int main()

因為給定的城市n的數目太大,建立陣列需要用到#include,vector就是乙個不定長陣列,vectora就是乙個類似於int a的整數陣列,只不過他的長度不確定,可以用a.size()讀取他的長度。

而vectora[max]就是乙個二維陣列,只是第一維的大小是固定的(不超過max),二維的大小就不固定了,這道題之所以用到vector就是利用了他的不定長,如果直接建立二維陣列a[n][n],n太大了,這樣的二維陣列絕對超出記憶體。

(1)標頭檔案#include.

(2)建立vector物件,vectorvec;

(3)尾部插入數字:vec.push_back(a);

(4)使用下標訪問元素,cout<

(5)向量大小:vec.size();

**://佇列思路(超時)

#include#include#include#includeusing namespace std;

int sta[110000];

int map[110000][3];

int ans[110000];

int main()

{ int m;

int n,s;

int i,j,k;

int now;

queueq;

scanf("%d",&m);

while(m--)

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

q.push(s);

for(i=1;i#include#include#include#includeusing namespace std;

int pre[100005];

vectorv[100005];

void dfs(int s)

{ int i;

for(i=0;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號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入 第一行輸入乙...