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