藍橋杯 PREV 53 分考場(DFS 回溯)

2021-10-25 13:41:10 字數 1397 閱讀 2296

資源限制

時間限制:1.0s 記憶體限制:256.0mb

問題描述

n個人參加某項特殊考試。

為了公平,要求任何兩個認識的人不能分在同乙個考場。

求是少需要分幾個考場才能滿足條件。

輸入格式

第一行,乙個整數n(1輸出格式

一行乙個整數,表示最少分幾個考場。

樣例輸入58

1 21 3

1 42 3

2 42 5

3 44 5

樣例輸出

4樣例輸入510

1 21 3

1 41 5

2 32 4

2 53 4

3 54 5

樣例輸出

5思路

可以抽象為無向圖染色問題。相鄰頂點不能染相同顏色,問至少要用多少種顏色。

用dfs搜尋+回溯

假設 n 個人需要 kcs 個考場 ,先在 kcs 個考場 安排n 個人 如果安排不下 再增加考場數。在已知的狀態下,然後去判斷下乙個學生是否可以在之前存在的教室,如果不可以的話,那麼就新開乙個教室。

通過dfs +剪枝 從所有可能情況中得到最小考場數。

提交**

#include

#define n 101

//關係表

int g[n]

[n];

//考場狀態

int p[n]

[n];

//考場數量

int num;

//n考試人數

int n;

using

namespace std;

void

dfs(

int x,

int kcs)

for(

int i =

1; i <= kcs; i++

)//列舉考場

} p[kcs +1]

[0]= x;

//遍歷完所有的考場 發現都不行 只能新開闢乙個考場

dfs(x +

1, kcs +1)

; p[kcs +1]

[0]=

0;}int

main()

dfs(1,

0); cout << num << endl;

return0;

}

回溯法與深度優先搜尋(dfs)

剪枝

藍橋杯 分考場(dfs)

dfs求解 思路每次判斷輸入的人是否可以和前面的組隊 問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1 ans return if p n 1 for int i 1 i kans i 判斷完前面已...

藍橋杯 分考場(回溯 dfs)

問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1輸出格式 一行乙個整數,表示最少分幾個考場。樣例輸入58 1 21 3 1 42 3 2 42 5 3 44 5 樣例輸出 樣例輸入510 1 21 ...

DFS 藍橋杯試題 分考場

oj位址 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。第一行,乙個整數n 1一行乙個整數,表示最少分幾個考場。5 81 2 1 31 4 2 32 4 2 53 4 4 545 101 2 1 31 4 1 52 3 2 42 5 3 ...