您的位置:首页 > 其它

poj 1129 Channel Allocation(四色定理)

2015-03-29 10:18 447 查看
< / pre><pre name = "code" class = "cpp">#include "stdio.h"
#include "string.h"
#include "algorithm"
using namespace std;
int map[26][26];
int used[26];
char ch[30];
int n;
/* 这个dfs是基于四色定理,所以dfs第一层循环i最大为4
这种写法可以运作在四色定理的题目里,无向图任意的相邻两点颜色不同

*/
void dfs(int node){
int flag, i, j;
if (node == n)
return;
for (i = 1; i <= 4; i++){
flag = 0;
//如果新结点与相邻结点颜色相同 则需要加颜色了,即i加1
for (j = 0; j<n; j++){
if (map[node][j] && used[j] == i){
flag = 1;
break;
}
}
//这个if意思是如果新结点与相邻结点颜色都不相同,那么就染旧颜色,再搜索下一个结点
if (!flag){
used[node] = i;
dfs(node + 1);
break;
}
}
}

int main(){
int i, j;
while (scanf("%d", &n), n){
memset(map, 0, sizeof(map));
memset(used, 0, sizeof(used));
for (i = 0; i < n; i++){
scanf("%s", ch);
for (j = 2; j < strlen(ch); j++)
{
map[i][ch[j] - 'A'] = 1;
map[ch[j] - 'A'][i] = 1;
}
}
dfs(0);
sort(used, used + 26);
if (used[25] == 1)
printf("1 channel needed.\n");
else
printf("%d channels needed.\n", used[25]);
}
}


DFS
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: