Channel Allocation POJ - 1129
考察:dfs
思路:
和前面的互为互质数简直一模一样,就是把条件换成无边即可.
本题最大的坑点在输出格式上,请注意名词单复数
实测本题字母没有乱序给出.
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <vector> 5 using namespace std; 6 const int N = 30; 7 int n,idx,ans = N; 8 vector<int> v[N]; 9 bool g[N][N]; 10 char s[N]; 11 bool check(int x,int f) 12 { 13 for(int i=0;i<v[x].size();i++) 14 if(g[f][v[x][i]]) return false; 15 return 1; 16 } 17 void dfs(int st) 18 { 19 if(idx>=ans) return; 20 if(st==n) 21 { 22 ans = min(idx,ans); 23 return; 24 } 25 for(int i=0;i<idx;i++) 26 { 27 if(check(i,st)) 28 { 29 v[i].push_back(st); 30 dfs(st+1); 31 v[i].pop_back(); 32 } 33 } 34 v[idx].push_back(st); 35 idx++; 36 dfs(st+1); 37 idx--; 38 v[idx].pop_back(); 39 } 40 int main() 41 { 42 while(scanf("%d",&n)!=EOF&&n) 43 { 44 idx = 0,ans = N; 45 memset(g,0,sizeof g); 46 for(int i=1;i<=n;i++) 47 { 48 v[i].clear(); 49 scanf("%s",s); 50 int len = strlen(s); 51 int fr = s[0]-'A'; 52 for(int i=2;i<len;i++) 53 { 54 int to = s[i]-'A'; 55 g[fr][to] = 1; 56 } 57 } 58 dfs(0); 59 if(ans==1) printf("1 channel needed.\n"); 60 else printf("%d channels needed.\n",ans); 61 } 62 return 0; 63 }