题目链接:
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=98233#problem/G
题目大意:
平面内最多26个点,给出一些点与点之间的是否相连,问最少使用多少颜色才能给这些点染色,并保证相邻点之间不同色。根据图的四色定理,最多四种颜色就能满足题意。
分析:
其实用不着用dfs的,用两层循环就能搞定,从数组下标0到数组下标n-1代表每个点,遍历每个点,对其进行1~4的颜色选择,每次选择后与相邻点进行比较判断,如果有颜色相同,就不能选这个颜色,换一个颜色,如果符合,进行下一次循环。每次点的颜色选择从1开始。最后选出颜色数组中最大的值即为最少使用的颜色。
QAQ被这道题坑惨了,没注意到输出格式中的单复数形式,一个WrongAnswer。以为自己想错了,去网上一搜一片的DFS,心里拔凉拔凉的,完全不造错哪了。最后实在想不出来去看了一下别人的代码,DFS也是找到就退出递归就可以输出了,最后才反应过来是输出的问题。
代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
int map[30][30];
int mark[30];
int n;
bool judge(int pos,int color)
{
for (int i = 0; i < n; i++)
{
if (map[pos][i])
{
if (mark[i] == color)
{
return false;
}
}
}
return true;
}
int main()
{
while (scanf("%d", &n) != EOF && n)
{
memset(map,0,sizeof(map));
memset(mark,0,sizeof(mark));
char str[35];
for (int i = 0; i<n; i++)
{
scanf("%s", str);
int len = strlen(str);
for (int j = 2; j<len; j++)
{
map[i][str[j] - 'A'] = 1;
map[str[j] - 'A'][i] = 1;
}
}
for (int i = 0; i <n ; i++)
{
for (int color = 1; color <= 4; color++)
{
mark[i] = color;
if (judge(i, color))
{
break;
}
}
}
int* min = (int*)max_element(mark, mark + n);
if (*min == 1)
{
printf("%d channel needed.\n",*min);
}
else
{
printf("%d channels needed.\n",*min);
}
}
return 0;
}