深度優先搜尋就是通過遞迴對所有的點進行遍歷操作,同時對已經訪問的點進行標記,逐步進行。當發現有點已經被訪問過了的時候,則退回到上一層點,同時將標記點取消標記。另選乙個未曾訪問過的點重新開始,直到遍歷了所有的點。
oj題目
題目描述:
每年畢業的季節都會有大量畢業生發起狂歡,好朋友們相約吃散夥飯,網路
上稱為「bg
」。參加不同團體的
bg會有不同的感覺,我們可以用乙個非負整數
為每個bg
定義乙個「快樂度」。現給定乙個
bg列表,上面列出每個
bg的快樂度、
持續長度、bg
發起人的離校時間,請你安排一系列
bg的時間使得自己可以獲
得最大的快樂度。
例如有4場bg
:第1場快樂度為
5,持續
1小時,發起人必須在
1小時後離開;
第2場快樂度為
10,持續
2小時,發起人必須在
3小時後離開;
第3場快樂度為
6,持續
1小時,發起人必須在
2小時後離開;
第4場快樂度為
3,持續
1小時,發起人必須在
1小時後離開。
則獲得最大快樂度的安排應該是:先開始第3
場,獲得快樂度
6,在第
1小時結
束,發起人也來得及離開;再開始第2
場,獲得快樂度
10,在第
3小時結束,
發起人正好來得及離開。此時已經無法再安排其他的bg
,因為發起人都已經離
開了學校。因此獲得的最大快樂度為16。
注意bg
必須在發起人離開前結束,你不可以中途離開一場
bg,也不可以中途加
入一場bg
。又因為你的人緣太好,可能有多達30
個團體bg
你,所以你需要寫個程式來解決這個
時間安排的問題。
輸入:測試輸入包含若干測試用例。每個測試用例的第1
行包含乙個整數
n (<=30)
,隨後有n
行,每行給出一場
bg的資訊:
h l t
其中 h
是快樂度,
l是持續時間(小時),
t是發起人離校時間。資料保證l不
大於t,
因為若發起人必須在
t小時後離開,
bg必須在主人離開前結束。 當n
為負數時輸入結束。
輸出:
每個測試用例的輸出佔一行,輸出最大快樂度。
樣例輸入: 3
6 3 3
3 2 2
4 1 3 4
5 1 1
10 2 3
6 1 2
3 1 1 -1
樣例輸出: 7
16
對於這道題目,可以採用dfs
來解決。首先我們要知道離校時間
t必須要大於持續時間,那麼當我們參加一場後,剩餘時間就是
t-l
,則參加的下一場持續時間必須要小於
t-l
例如對於
h l t t-l
6 3 3 0
3 2 2 0
4 1 3 2
當參加第一場後,持續時間是3
,而沒有任何一場的
t-l能夠大於等於
3,所以最後就只能參加一場宴會,產生結果是
6.而若是從第二場開始參加,花費時間是
2,因為剩餘時間
t-l中能夠大於等於
2只有第三場
(也就是說如果我們參加了第三場,就還有時間可以參加第二場),所以參加者兩場的歡樂度總和是7
,與只參加第一場的
6相比,就可以得出最大結果。對於第三場的情況也是這麼分析的。
#include #include int a[30][4], n, id[30];
int sum, max;
void dfs(int time)
{ for(int i=0; i=time && id[i]==0) //遍歷規則
{sum += a[i][0];
id[i]=1; //標記點
if(max=0)
{for(int i=0; i
廣度優先搜尋 深度優先搜尋
前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...
廣度優先搜尋,深度優先搜尋
深度優先搜尋 depth first search 簡稱dfs。最直觀的例子就是 走迷宮 廣度優先搜尋 每個頂點都要進出一遍佇列,每個邊也都會被訪問一次,所以 時間複雜度o v e 主要消耗記憶體的是visited prev陣列 queue佇列,所以 空間複雜度o v 深度優先搜尋 每條邊最多會被訪...
深度優先搜尋 廣度優先搜尋
深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 package com.neusoft.data.structure 深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 public class dfsbfs 初始化 邊 mmatrix new int vlen vlen for...