poj1129 Channel Allocation DFS

題目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 }
相關文章
相關標籤/搜索