染色问题:相邻不能染同一种颜色
最少需要的颜色的数量=最大团点的数量
#include<bits/stdc++.h> using namespace std; #define N 27 int 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. "); else printf("%d channels needed. ", ans); } return 0; }