資源限制
時間限制: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 ...