建模:一个有N个节点的无向图,要求对每个节点进行染色,使得相邻两个节点颜色都不同,问最少需要多少种颜色?
对点i的染色操作:从最小的颜色开始搜索,当i的直接相邻(直接后继)结点已经染过该种颜色时,搜索下一种颜色。就是说i的染色,当且仅当i的临近结点都没有染过该种颜色,且该种颜色要尽可能小。
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
int n;
int m[30][30],color[30];
char str[100];
int main() {
while(scanf("%d",&n),n){
memset(color,0,sizeof(color));
memset(m,0,sizeof(m));
getchar();
for(int i=0;i<n;i++){
gets(str);
int l=strlen(str);
for(int j=2;j<l;j++) m[i][str[j]-'A']=1;
}
int i,j,k=1;//第k种颜色
color[0]=k;//给第一个节点染上第一种颜色
for(i=1;i<n;i++){//对于第i个节点
for(j=1;j<=k;j++){//从小到大遍历所有已有的颜色,找第一个没有被i的相邻节点用过的颜色
bool f=false;
for(int l=0;l<n;l++){
if(m[i][l]==1&&color[l]==j){//和i相邻的节点中,颜色j已经被用过
f=true;
break;
}
}
if(f==false){//
color[i]=j;
break;
}
}
if(j==k+1) color[i]=++k;
}
if(k==1) printf("1 channel needed.\n");
else printf("%d channels needed.\n",k);
}
return 0;
}