题意:
最多有26个字母
n行表示有n个字母
下面n行给出 该字母和哪些字母相邻
问:至少要几种颜色染色后相邻字母不同色
四色定理至多4种
暴力枚举
#include<iostream>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
#define N 30
struct Edge{
int from, to, nex;
}edge[N<<2];
int head[N], edgenum;
void addedge(int u, int v){
u++, v++;
Edge E={u,v,head[u]};
edge[edgenum] = E;
head[u] = edgenum++;
}
char s[30];
int col[N], ans, n;
bool haha[5];
bool vis[N];
int spfa(int root){
queue<int>q;
q.push(root);
vis[root] = true;
int ok = 0;
while(!q.empty()){
int u = q.front(); q.pop();
memset(haha, 0, sizeof(haha));
for(int i = head[u]; ~i; i =edge[i].nex)
{
int v = edge[i].to;
if(col[v])haha[col[v]] = true;
else if(vis[v] == false)vis[v] = true, q.push(v);
}
for(int i = 1; i <= ans ;i++)
if(haha[i] == false){col[u] = i;ok++;break;}
if(col[u] == 0)return 0;
}
return ok;
}
int main()
{
int i, j;
while(scanf("%d",&n) ,n){
memset(head, -1, sizeof(head)); edgenum = 0;
for(i = 0; i < n; i++)
{
scanf("%s",s);
int len = strlen(s);
for(j = 2; j < len; j++)
addedge(s[0]-'A',s[j]-'A'), addedge(s[j]-'A',s[0]-'A');
}
memset(col, 0, sizeof(col));
for(ans = 1; ans <4; ans++)
{
memset(vis, 0, sizeof(vis));
int temp = 0;
for(j = 1; j <=n;j++)
if(!vis[j])
temp += spfa(j);
if(temp == n)break;
}
printf("%d ",ans);
if(ans>1)
printf("channels needed.\n");
else
printf("channel needed.\n");
}
return 0;
}