POJ 1129 Channel Allocation(DFS)
水过啊。初看此题,一点想法没有。然后不知从何暴力啊,看看DISCUSS,说利用四色定理可知,4种颜色可完全染色。然后有点思路了,从1种颜色枚举到3种颜色。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <string> 5 #include <map> 6 #include <algorithm> 7 #include <queue> 8 #include <vector> 9 using namespace std; 10 char str[101]; 11 int p[40][40],o[40],n,z; 12 void dfs(int key,int color) 13 { 14 int i,j; 15 if(key == n) 16 { 17 z = 1; 18 return ; 19 } 20 for(i = 1;i <= color;i ++) 21 { 22 o[key] = i; 23 for(j = 0;j < n;j ++) 24 { 25 if(p[key][j]&&o[key] == o[j]) 26 break; 27 } 28 if(j == n) 29 dfs(key+1,color); 30 o[key] = 0; 31 } 32 } 33 int main() 34 { 35 int i,j,len,sv,ev,ans; 36 while(scanf("%d",&n)!=EOF) 37 { 38 if(n == 0) break; 39 ans = 4; 40 memset(p,0,sizeof(p)); 41 for(i = 1; i <= n; i ++) 42 { 43 scanf("%s",str); 44 sv = str[0] - 'A'; 45 len = strlen(str); 46 for(j = 2; j < len; j ++) 47 { 48 ev = str[j] - 'A'; 49 p[sv][ev] = 1; 50 } 51 } 52 for(ans = 1;ans <= 3;ans ++) 53 { 54 z = 0; 55 memset(o,0,sizeof(o)); 56 dfs(0,ans); 57 if(z) break; 58 } 59 if(ans == 1) 60 printf("%d channel needed.\n",ans); 61 else 62 printf("%d channels needed.\n",ans); 63 } 64 return 0; 65 }