染色问题:相邻不能染同一种颜色
最少需要的颜色的数量=最大团点的数量
#include<bits/stdc++.h> using namespace std;#define N 27int n; int mp[N][N]; int ans; int alt[N][N]; int Max[N];bool dfs(int cur,int tot)//cur是s1集合的个数 {if(0==cur){if(tot>ans){ans=tot;return true;}return false;}for(int i=0;i<cur;i++){if( tot+cur-i<=ans )return false;int u=alt[tot][i];if( Max[u]+tot<=ans )return false;int next=0;for(int j=i+1;j<cur;j++)if(mp[u][ alt[tot][j] ])alt[tot+1][next++]=alt[tot][j];if(dfs(next,tot+1)) return 1;}return 0; }int maxclique(void) {ans=0;memset(Max,0,sizeof(Max));for(int i=n-1;i>=0;i--){int cur=0;for(int j=i+1;j<n;j++)if(mp[i][j])alt[1][cur++]=j;//1为s1集合dfs(cur,1);Max[i]=ans;}return ans; }int main() { char s[30];while(scanf("%d",&n),n){ memset(mp,0,sizeof (mp));for(int i=0;i<n;i++){scanf("%s",s);for(int j=2;s[j];j++)mp[i][ s[j]-'A' ]=mp[ s[j]-'A' ][i]=1;}int ans=maxclique();if(ans==1) printf("1 channel needed.\n");else printf("%d channels needed.\n", ans);}return 0; }