題目ios
題意:給定N個節點,讓你對其塗色,使其任何相鄰的兩個節點顏色不一樣。spa
思路:code
1. 問題模型是着色問題,枚舉顏色的個數, 每次枚舉看能夠完成所有點的着色.blog
2. 採用深搜,每一次當前色的種數深搜完畢就加1種,直到所有點都被着色完畢, 這樣get
從最少的開始深搜,結果出現確定是最少的。string
該題N<26,能夠不用四色原理剪枝。it
附上一發代碼:io
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int flag,ans,map[30][30],color[30],n; 7 char s[40]; 8 int check(int x,int y) //判斷是否存在相鄰節點顏色相同 9 { 10 for(int i=0;i<n;i++) 11 { 12 if(map[x][i]&&color[i]==y) 13 return 0; 14 } 15 return 1; 16 } 17 void dfs(int a,int b) //當前搜索到下標爲a的節點,此時總共用的色彩數爲b 18 { 19 if(flag) 20 return; 21 if(a>=n) //當全部節點都被着色後,返回 22 { 23 flag=1; 24 return; 25 } 26 for(int i=1;i<=b;i++) //搜索一種顏色能塗的全部狀況 27 { 28 if(check(a,i)) 29 { 30 color[a]=i; 31 dfs(a+1,b); 32 color[a]=0; //回溯 33 } 34 } 35 if(!flag) //當用b種顏色沒法完成時,則增長一種顏色進行着色 36 { 37 ans++; 38 dfs(a,b+1); 39 } 40 } 41 main() 42 { 43 int i,j; 44 while(~scanf("%d",&n)&n) 45 { 46 memset(map,0,sizeof(map)); 47 memset(color,0,sizeof(color)); 48 for(i=0;i<n;i++) 49 { 50 scanf("%s",s); 51 for(j=2;s[j]!='\0';j++) //for(j=2;j<strlen(s);j++) 52 map[s[0]-'A'][s[j]-'A']=1; 53 } 54 flag=0;ans=1; 55 dfs(0,1); 56 if(ans==1) 57 printf("1 channel needed.\n"); 58 else 59 printf("%d channels needed.\n",ans); 60 } 61 }