poj1129_四色问题

题意:染色问题,图中之间有边的两个区域不能染成相同的颜色。求将图中每个区域全部染色后需要最少的颜色。
分析:参考染色定理得,无论图中有多少区域,最多需要4个区域。因此遍历这四种情况即可.
代码:

View Code
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <memory.h>
 4 using namespace std;
 5 
 6 const int maxnum=27;
 7 bool array[maxnum][maxnum];
 8 int num;
 9 
10 void fuction()
11 {
12     int i,j,k,l;
13     for(i=1;i<=num;i++)
14         for(j=1;j<=num;j++)
15             for(k=1;k<=num;k++)
16                 for(l=1;l<=num;l++)
17                     if(array[i][j]&&array[i][k]&&array[i][l]&&array[j][k]&&array[j][l]&&array[k][l])
18                     {
19                         printf("4 channels needed.\n");
20                         return ;
21                     }
22     for(i=1;i<=num;i++)
23         for(j=1;j<=num;j++)
24             for(k=1;k<=num;k++)
25                 if(array[i][j]&& array[i][k]&&array[j][k])
26                 {
27                     printf("3 channels needed.\n");
28                     return;
29                 }
30     for(i=1;i<=num;i++)
31         for(j=1;j<=num;j++)
32             if(array[i][j])
33             {
34                 printf("2 channels needed.\n");
35                 return;
36             }
37     printf("1 channel needed.\n");
38 }
39 
40 int main()
41 {
42     int i;
43     bool flag;
44     char ch,tch;
45     while(scanf("%d",&num)!=EOF)
46     {
47         if(num==0) break;
48         memset(array,false,sizeof(array));
49         flag=false;
50         getchar();
51         for(i=0;i<num;i++)
52         {
53             scanf("%c%c",&ch,&tch);
54             int a=ch-'A'+1;
55             while(scanf("%c",&ch)!=EOF)
56             {
57                 if(ch=='\n') break;
58                 int b=ch-'A'+1;
59                 array[a][b]=true;
60                 array[b][a]=true;
61             }
62         }
63         fuction();
64     }
65     return 0;
66 }

 另一种方法是最大团,我用最大团做完之后发现,其实这个题用最大团的解法是错误的。比如:

5
A:BE
B:AC
C:BD
D:CE
E:AD

这组数据用最大团做,ans=2,但是这个题的答案应该是3.可见这个题的数据有问题,最大团的代码见下、

View Code
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <memory.h>
 4 using namespace std;
 5 //148K 0MS
 6 
 7 const int maxnum=27;
 8 bool array[maxnum][maxnum];
 9 int use[maxnum];
10 int num,cn,bestn;
11 
12 
13 void dfs(int i)
14 {
15     if(i>num)
16     {
17         bestn=cn;
18         return ;
19     }
20     bool flag=true;
21     int j;
22     for(j=1;j<i;j++)
23         if(use[j] && !array[j][i])
24         {
25             flag=false;
26             break;
27         }
28     if(flag)
29     {
30         cn++;
31         use[i]=true;
32         dfs(i+1);
33         cn--;
34         use[i]=false;
35     }
36     if(cn+num-i>bestn)
37     {
38         use[i]=false;
39         dfs(i+1);
40     }
41 }
42 
43 int main()
44 {
45     int i;
46     char ch,tch;
47     while(scanf("%d",&num)&& num!=0)
48     {
49         memset(array,false,sizeof(array));
50         memset(use,false,sizeof(use));
51         cn=0;
52         bestn=0;
53         getchar();
54         for(i=0;i<num;i++)
55         {
56             scanf("%c%c",&ch,&tch);
57             int a=ch-'A'+1;
58             while(scanf("%c",&ch) && ch!='\n')
59             {
60                 int b=ch-'A'+1;
61                 array[a][b]=true;
62                 array[b][a]=true;
63             }
64         }
65         dfs(1);
66         if(bestn==1)
67             printf("1 channel needed.\n");
68         else
69             printf("%d channels needed.\n",bestn);
70     }
71     return 0;
72 }
73 /*
74 6
75 A:BEF
76 B:AC
77 C:BD
78 D:CEF
79 E:ADF
80 F:ADE
81 */

 

tju oj 1077

posted @ 2012-07-29 08:28  pushing my way  阅读(1300)  评论(0编辑  收藏  举报