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 }

 

posted @ 2013-01-20 16:10  Naix_x  阅读(131)  评论(0编辑  收藏  举报