题目大意:
给定一些点,和它们之间的连通关系,要求相邻的点之间信号不同,求出最少需要多少信号?
这道题其实是染色问题,可以参照 图论里面的 四色定理(即只要四种颜色就可以将一幅地图染色,要求是相邻的各块面积颜色不同)
所以这道题最大值就是4
因为此题最多也就26个点,所以暴力搜索dfs,也可以accept
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int n; //点的个数
bool map[30][30]; //描述点与点之间连接的情况
int mark[30]; //每个点涂的颜色
char str[33]; //输入的字符串
int ans; //根据四色定理,最大为4
bool Judge(int x,int y){
for(int i=0;i<n;i++){
if(map[x][i]&&mark[i]==y&&i!=x)
return 0;
}
return 1;
}
void dfs(int k){
if(k == n){
ans = min(ans,*max_element(mark,mark+n));
return;
}
else{
for(int i=k;i<n;i++){
for(int j=1;j<=4;j++){
if(Judge(i,j)){
mark[i] = j;
dfs(i+1);
}
}
}
}
}
int main(){
int i,j;
while(cin>>n,n){
memset(map,false,sizeof(map));
for(i=0;i<n;i++){
cin>>str;
for(j=2;j<strlen(str);j++){
map[i][str[j]-'A'] = true;
map[str[j]-'A'][i] = true;
}
}
memset(mark,0,sizeof(mark));
ans = 4;
mark[0] = 1;
dfs(1);
if(ans == 1)
cout<<"1 channel needed."<<endl;
else
cout<<ans<<" channels needed."<<endl;
}
}
这里有一个 求数组里面最大值的 快捷求法,就是利用STL算法里面的 *max_element(mark,mark+n),其中n是数组的元素个数,mark为数组名