Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 11099 | Accepted: 5700 |
Description
Since the radio frequency spectrum is a precious resource, the number of channels required by a given network of repeaters should be minimised. You have to write a program that reads in a description of a repeater network and determines the minimum number of channels required.
Input
Following the number of repeaters is a list of adjacency relationships. Each line has the form:
A:BCDH
which indicates that the repeaters B, C, D and H are adjacent to the repeater A. The first line describes those adjacent to repeater A, the second those adjacent to B, and so on for all of the repeaters. If a repeater is not adjacent to any other, its line has the form
A:
The repeaters are listed in alphabetical order.
Note that the adjacency is a symmetric relationship; if A is adjacent to B, then B is necessarily adjacent to A. Also, since the repeaters lie in a plane, the graph formed by connecting adjacent repeaters does not have any line segments that cross.
Output
Sample Input
2 A: B: 4 A:BC B:ACD C:ABD D:BC 4 A:BCD B:ACD C:ABD D:ABC 0
Sample Output
1 channel needed. 3 channels needed. 4 channels needed.
Source
ID-DFS求解這道題比較容易(interative deepening depth-first search)
第一次樣例測試失敗,是因爲沒有處理好輸入(本來應該是從line讀取字符,結果寫成了cin獲取字符)。
注意四色定理的直觀描述:
任意一個無飛地的地圖都可以用四種顏色染色,使得沒有兩個相鄰國家染的顏色相同。事實上實際的地圖往往是有飛地的,比如很多國家會有兩塊地方。
提交記錄:
1、Accepted!
/*Source Code
Problem: 1129 User: 775700879
Memory: 744K Time: 0MS
Language: G++ Result: Accepted
Source Code*/
#include
#include
#include
#include
using namespace std;
int n;
int data[30][30];
char line[50];
int color[50];
bool dfs(int step, int used, int up) {
if (used > up) return false;
if (step == n) {
return true;
}
int i, j;
bool isused[50] = {0};
for (i = 0; i < step; i++) {
if (data[step][i] == true && color[i] != -1) isused[color[i]] = true;
}
for (i = 1; i <= used; i++) {
if (!isused[i]) {
color[step] = i;
if(dfs(step+1, used, up)) return true;
color[step] = 0;
}
}
color[step] = used+1;
if (dfs(step+1, used+1, up)) return true;
color[step] = 0;
return false;
}
int main() {
int i, j;
while (cin >> n) {
if (n == 0) break;
char ch;
memset(data, 0, sizeof(data));
for (i = 0; i < n; i++) {
cin >> line;
color[i] = -1;
for (j = 2; line[j] != 0; j++) {
//cin >> ch;
data[i][line[j]-'A'] = 1;
}
}
for (i = 1; i <= n; i++) {
if (dfs(0, 0, i)) {
cout << i << " channel";
if (i != 1) cout << "s";
cout << " needed." << endl;
break;
}
}
}
}