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 }

 

posted @ 2021-03-11 19:40  acmloser  阅读(53)  评论(0编辑  收藏  举报