Channel Allocation
经典的图着色问题
的变形,其实就是换了一个情境,有“公式”可以套,但是提交时没有通过
,显示 Wrong Answer,但是样例是过了,时间问题就不再深究了,这里我只要求明白算法的思想:
//经典着色问题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define inf 1000//对 color 数组初始化为“无穷大”
using namespace std;
int n;
string s;
int adj[30][30];//邻接矩阵
int color[30];
void dfs(int x) {
if (x == n) {//递归的出口
int ans = 0;
for (int i = 0;i < n;i++) {
if (color[i] > ans) ans = color[i];
}
//两种输出方式
if (ans > 0) cout << ans + 1 << " channels needed." << endl;
else cout << ans + 1 << " channel needed." << endl;
return;
}
else {
for (int i = 0;i < n;i++) {
int flag = 0;
for (int j = 0;j < n;j++) {
if (adj[x][i] == 1 && i == color[j]) {//邻接点不能“同色”
flag = 1;break;
}
}
if (!flag) {
color[x] = i;//若遍历过后不同色就取当前 i 为 x 的颜色
break;
}
}
dfs(x + 1);
color[x] = inf;//回溯!!
}
}
int main() {
while (cin >> n && n) {
memset(adj, 0, sizeof(adj));
memset(color, inf, sizeof(color));
for (int i = 0;i < n;i++) {
cin >> s;
for (int j = 2;j < s.size();j++) {
adj[i][s[j] - 'A'] = 1;
}
}
dfs(0);
}
return 0;
}
补充: