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

你可能感兴趣的:(poj)