POJ 1129 Channel Allocation 四色定理dfs
题目: http://poj.org/problem?id=1129
开始没读懂题,看discuss的做法,都是循环枚举的,很麻烦。然后我就决定dfs,调试了半天终于0ms A了。
1 #include <stdio.h> 2 #include <string.h> 3 bool graph[26][26], vis[26][4]; 4 int n, ans; 5 6 void calc() 7 { 8 int cnt = 0; 9 for(int i = 0; i < 4; i++) 10 { 11 for(int j = 0; j < n; j++) 12 { 13 if(vis[j][i]) 14 { 15 cnt++; 16 break; 17 } 18 } 19 } 20 if(cnt < ans)ans = cnt; 21 } 22 23 void dfs(int x) 24 { 25 if(x >= n) 26 { 27 calc(); 28 return; 29 } 30 31 for(int i = 0; i < 4; i++) 32 { 33 bool ok = 1; 34 for(int j = 0; j < n; j++) 35 { 36 if((graph[j][x] && vis[j][i]) || (graph[x][j] && vis[j][i])) 37 { 38 ok = 0; 39 break; 40 } 41 } 42 if(ok) 43 { 44 vis[x][i] = 1; 45 dfs(x+1); 46 vis[x][i] = 0; 47 } 48 } 49 } 50 51 int main() 52 { 53 char s[30]; 54 while(scanf("%d", &n) != EOF && n) 55 { 56 ans = 0x3f3f3f3f; 57 memset(graph, 0, sizeof(graph)); 58 memset(vis, 0, sizeof(vis)); 59 for(int i = 0; i < n; i++) 60 { 61 scanf("%s", s); 62 for(int j = 2; s[j]; j++) 63 { 64 graph[i][s[j]-'A'] = 1; 65 } 66 } 67 vis[0][0] = 1; 68 dfs(1); 69 if(ans == 1) 70 printf("1 channel needed.\n"); 71 else printf("%d channels needed.\n", ans); 72 } 73 return 0; 74 }