题意:

最多有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;
}