ural 1208 Legendary Teams Contest

题意描述:给定K支队伍,每队三个队员,不同队伍之间队员可能部分重复,输出这些队员同时能够组成多少完整的队伍;

    DFS,利用DFS深度优先搜索,如果该队所有队员都没有被访问过,那么将该队计入结果,再去选择下一队~

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <stdlib.h>
 6 #include <map>
 7 using namespace std;
 8 
 9 struct team{
10     int a,b,c;
11 }; 
12 
13 team dif[20];
14 int n,result;
15 int visit[60];
16 map<string,int>q;
17 
18 void dfs(int x,int y){
19     result = max(result,x);
20     if(y>n) 
21     return ;
22     
23     //如果 dif[y]队的成员都没被访问过  ,那么就可以计入结果,result++; 
24     //否则就 继续搜索下一队。 
25     if(!visit[dif[y].a]&&!visit[dif[y].b]&&!visit[dif[y].c]){
26         visit[dif[y].a] = visit[dif[y].b] = visit[dif[y].c]=1;
27         dfs(x+1,y+1);
28         visit[dif[y].a] = visit[dif[y].b] = visit[dif[y].c]=0;
29     }
30     else{
31         dfs(x,y+1);    
32     }
33 }
34 
35 int main(){
36     int temp=0;
37     string str1,str2,str3;
38     cin>>n;
39     for(int i=1;i<=n;i++){
40         cin>>str1>>str2>>str3;   //利用 map  直接将重复元素滤去 
41         
42         if(!q[str1]){   //选择不重复的 string,匹配 int后, 作为q的新元素 
43             temp++;
44             q[str1] = temp;
45         }
46         if(!q[str2]){
47             temp++;
48             q[str2] = temp;
49         }
50         if(!q[str3]){
51             temp++;
52             q[str3] = temp;
53         }
54         dif[i].a = q[str1];
55         dif[i].b = q[str2];
56         dif[i].c = q[str3];
57     }  
58     //如此就将人名映射成不同的数字  ,然后在 visit[]中计入是否已经访问过。 
59     
60     for(int i=1;i<= n;i++){
61         visit[dif[i].a] = visit[dif[i].b] = visit[dif[i].c] = 1;
62         dfs(1,i+1);
63         visit[dif[i].a] = visit[dif[i].b] = visit[dif[i].c] = 0;
64     }
65     cout<<result<<endl;
66     return 0;
67 }
原文地址:https://www.cnblogs.com/liugl7/p/4771643.html