poj 1129 Channel Allocation ( dfs )
题目:http://poj.org/problem?id=1129
题意:求最小m,使平面图能染成m色,相邻两块不同色
由四色定理可知顶点最多需要4种颜色即可。我们于是从1开始试到3即可。
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<stack> 6 #include<queue> 7 #include<iomanip> 8 #include<cmath> 9 #include<map> 10 #include<vector> 11 #include<algorithm> 12 using namespace std; 13 14 int n,G[30][30],vis[30][5],ans; 15 void pri() 16 { 17 int f=-1; 18 for(int i=0; i<4; i++) 19 { 20 for(int j=0; j<n; j++) 21 if(vis[j][i]&&f<i) 22 f=i; 23 } 24 if(ans>f) 25 ans=f; 26 } 27 void dfs(int x) 28 { 29 if(x>=n) 30 { 31 pri(); 32 return; 33 } 34 for(int i=0; i<4; i++) 35 { 36 int f=1; 37 for(int j=0; j<n; j++) 38 { 39 if((G[j][x]&&vis[j][i])||(G[x][j]&&vis[j][i])) 40 { 41 f=0; 42 break; 43 } 44 } 45 if(f) 46 { 47 vis[x][i]=1; 48 dfs(x+1); 49 vis[x][i]=0; 50 } 51 } 52 } 53 int main() 54 { 55 char s[30]; 56 while(cin>>n&&n) 57 { 58 memset(G,0,sizeof(G)); 59 memset(vis,0,sizeof(vis)); 60 for(int i=0; i<n; i++) 61 { 62 cin>>s; 63 int u=s[0]-65; 64 for(int j=2; s[j]; j++) 65 { 66 int v=s[j]-65; 67 G[u][v]=1; 68 } 69 } 70 ans=10; 71 vis[0][0]=1; 72 dfs(1); 73 ans+=1; 74 if(ans == 1) 75 printf("1 channel needed.\n"); 76 else 77 printf("%d channels needed.\n",ans); 78 } 79 return 0; 80 } 81