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  

 

posted @ 2013-08-28 19:38  水门  阅读(194)  评论(0编辑  收藏  举报