DFS訓練日記

2021-10-23 12:46:06 字數 2326 閱讀 1421

洛谷p1019

dfs搜尋順序:

搜尋現在節點所有可以到達的點,然後再遞迴搜尋這乙個點。

邊界:1.每個單詞只能用兩次

2.前後兩個單詞一定是否能拼在一起

這道題中如何判斷兩個單詞是否能接到一起是難點,需要注意應用substr()函式,另外,基於貪心,如果要是接龍後的單詞最長,那麼重疊部分就要最短。(詳見下面**)

#include

#include

using

namespace std;

int n;

const

int max=

110;

string input[max]

;char start;

int ans=0;

int g[max]

[max]

;int used[max]

;//用過幾次

void

dfs(

int last,string dragon)

used[last]--;

}int

main()

}for

(int i=

0;i(input[i][0

]==start)

dfs(i,input[i]);

cout

}

洛谷p1135 奇怪的電梯

dfs搜尋順序:

從起點(也就是第一層)開始搜尋,對於每個正在搜尋的點遞迴的搜尋,向下移動和向上移動兩種方案。

剪枝:最優化剪枝:如果當前執行的方案數已經大於答案的方案數,那麼當前情況一定不合法。

#include

using

namespace std;

int n,a,b;

const

int max=

210;

int k[max]

;int ans=max;

bool vt[max]

;void

dfs(

int now,

int cnt)

vt[now]

=true;if

(now+k[now]

<=n&&

!vt[now+k[now]])

dfs(now+k[now]

,cnt+1)

;if(now-k[now]

>0&&

!vt[now-k[now]])

dfs(now-k[now]

,cnt+1)

; vt[now]

=false;}

intmain()

else

printf

("%d\n"

,ans)

;return0;

}

洛谷p1294高手去散步

dfs搜尋順序:

列舉所有點作為起點,呼叫遞迴函式,遞迴地搜尋所有與其相連的點中合法(在這種方案下沒有被選擇過)的點.

搜尋優化:

用鄰接表來存邊

w[idx]

=c; e[idx]

=b; ne[idx]

=h[a]

; h[a]

=idx++

;

獻上**

#include

#include

#include

#include

using

namespace std;

int n,m;

const

int max=

210;

int h[max]

,e[max]

,ne[max]

,w[max]

,idx;

int ans;

bool vt[max]

;void

add(

int a,

int b,

int c)

void

dfs(

int now,

int dist)

int c=w[i]

;dfs

(b,dist+c);}

vt[now]

=false;}

intmain()

for(

int i=

1;i<=n;i++

)dfs

(i,0);

printf

("%d"

,ans)

;return0;

}

訓練日記 20161024

初賽好像不會掛了,好開心!版權原因,不上傳題目。題意 求1 n n 1000 的排列中逆序對恰好為 k 個的排列數目。多測。題解 f i j 表示前 i 個數,逆序對個數恰好為 j的排列個數,易得轉移方程f i j i 1k 0f i 1 j k 用字首和優化可使複雜度降為o n2 題意 對於乙個長...

訓練日記 20170324

長久不更新部落格了。期間經歷了恰好被ag線踩的wc,經歷了漫長痛苦的小高考準備。現在終於可以重整旗鼓,向省選進發!幾個月來,唯一不變的是我仍然是個超級蒟蒻 版權原因,不上傳題目。題意 最小樹形圖 去年就接觸 聽說 過的演算法,一直沒有真正寫過。因為各種奇怪的細節錯誤,調了好幾個小時 比如找環時沒有判...

訓練日記 20170328

今天的題目似乎很水 好多人都提前ak離場了,於是提前一小時收題。但是我還是各種不會。思維江化?話說,聽到一句很有趣的話 山不在高,有林則徐 水不在深,有江 題意 給定一棵有n n 105 個節點的有根樹,編號互不重複。詢問有多少棵子樹內節點編號構成乙個連續區間。題解 水題,對於每個節點 i 記錄以該...