1. 关于复杂度的计算。没有用四色定理。直接暴力加剪枝。
2. 148K 0MS, 要求:Time Limit: 1000MS Memory Limit: 10000K
3. 主要是原来无从下手。后来看了 点击打开链接才有了思路。主要就是map二维函数和color一维,给了自己思路。map的第一个参数用本点,然后二维是相邻点。color则是记录每个点的颜色。
4. 输入值得注意。
2. 148K 0MS, 要求:Time Limit: 1000MS Memory Limit: 10000K
3. 主要是原来无从下手。后来看了 点击打开链接才有了思路。主要就是map二维函数和color一维,给了自己思路。map的第一个参数用本点,然后二维是相邻点。color则是记录每个点的颜色。
4. 输入值得注意。
5. dfs与前面略有不同。第二次dfs不需要考虑回溯了。
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int ans;
bool map[26][26];
int color[26];
bool isFind;
int num;
//判断此id可否用otal代表的颜色
bool isOK(int id, int total)
{
for(int i = 0;i < num; i++)
{
if(map[id][i]&&color[i]==total)
return false;
}
return true;
}
//深搜,用id号和目前的颜色总数做参数。
bool dfs(int id, int total)
{
//递归结束条件
if(id>=num)
{
return true;
}
//在之前已经用过的颜色里面选取可以用的。
for(int i = 1; i<=total; i++)
{
if(isOK(id,i))
{
color[id] = i;
if(dfs(id+1,total))
return true;
color[id]=0;
}
}
//在上面找不到,就直接用新的。
color[id]=total+1;
ans++;
if(dfs(id+1,total+1))
return true;
return false;
}
int main()
{
//从文件读入
// freopen("channel.txt","r",stdin);
while(scanf("%d",&num)&&num)
{
//空行
getchar();
memset(map,false,sizeof(map));
memset(color,0,sizeof(color));
char s[26];
for(int i = 0; i < num; i++)
{
gets(s);
for(int j = 2; s[j]!='\0'; j++)
{
map[s[0]-'A'][s[j]-'A']=true;
}
}
isFind = false;
ans = 1;
dfs(0,1);
if(ans==1)
{
printf("1 channel needed.\n");
}else
printf("%d channels needed.\n",ans);
}
}
。