看了一上午,終於看懂了這個遞迴,或許一些大牛或熟練的人已經對裡面的思路了然於心,但對於初學者的我還是花了好長時間才理解裡面的彎彎繞繞,真的是佩服想出來這種方法的人,又一次的對it界的前輩和大牛們的智慧型感到敬佩。
描述在乙個吝嗇的國度裡有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,3......10號城市的路上離終點城市最近的城市。以這組資料為例,畫出的圖形就是:
int pre[100005]; //pre儲存的是每個節點的父節點 也就是所求答案
vectorv[100005]; //v儲存的是每個城市與其他城市之間的路
void dfs(int cur)
} int main()
dfs(cur); // ⑥起點開始深搜
for(i = 1; i <= num; ++i)
printf("%d ", pre[i]); //⑦每個節點的父節點都儲存在pre陣列,輸出即可
} return 0;
}主函式中全部都是一些流程,這個**的全部精髓都在dfs函式中,我想雖然只有兩三行,新手和沒有耐心的人看到那麼穿插的陣列名,估計也是胸口一口老血想要湧出
void dfs(int cur)
}
我的理解:
首先,第乙個從主函式中得來的引數 cur=1。
然後,從這個開始入手,有的已經推導過的同學估計已經發現,這是乙個巨大的樹,遍歷每個細枝末節,而且會經常性的一層一層返回。
這是裡面每個資料大概的關係圖(以例題中試驗的資料為例,方便理解):
然後我們就可以輕易的檢視 v[1][1]=9,v[1][2]=8,,,,等等
然後我們就可以進行搜尋遍歷的演算:
這只是整個遍歷的一小部分,還有許許多多的分支沒有顯示出來,光有圖怕有的同志看不太懂,我簡單描述一下。
第乙個cur=1,然後開始遍歷v[1]以下的結點,v[1][0]=9,v[1][1]=8,v[1][2]=2,先開始v[1][0]=9,這是,pre[v[1][0]]等於0,進行下面操作,令pre[9]=1,然後cur=9,在函式內呼叫這個函式,這是,問題又變成了cur=9的情況,v[9]下面有v[9][0]=1,v[9][1]=5,然後發現v[9][0]=1是個父節點,跳出此次迴圈進行第二個v[9][2]=5,pre[5]=0,再次進行下面的操作,pre[5]=9,cur=5,呼叫函式,v[5]下面只有乙個v[5][0]=9,還是個父節點,往上跳一級,回到v[9]階段,發現v[9]也迴圈完了,就再往上跳一級,回到v[1],到這裡,v[1][9]的遍歷才算是完成,進行下乙個v[1][8],類似v[1][0]=9的操作,依次往下遍歷,,,
其實,這裡面的很多步驟不用去都寫出來了解,從冰山一角就可以知道他完整的模樣,但是,對於不了解的同志來說,這裡面還是很麻煩很混亂的,所以就想對於很多像我一樣的新手,來徹底的解析一下裡面的步驟,來理解這個遞迴搜尋的含義。
希望能夠幫助到你。
還有就是一點,我感覺在網上搜到的別人的**,很多注釋都不是特別的明了,尤其是變數名,有時看啊看,就忘了表示的什麼,有點不方便,建議就是根據問題,然後在前排寫上注釋,注釋內容為每個變數名的含義,能增加讀和理解**的速度,節省時間,也能平緩看不懂**時煩躁的情緒。
nyoj20 吝嗇的國度
時間限制 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號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入第一行輸入乙個...