您的位置:首页 > 其它

ural 1208 Legendary Teams Contest

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

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <map>
using namespace std;

struct team{
int a,b,c;
};

team dif[20];
int n,result;
int visit[60];
map<string,int>q;

void dfs(int x,int y){
result = max(result,x);
if(y>n)
return ;

//如果 dif[y]队的成员都没被访问过  ,那么就可以计入结果,result++;
//否则就 继续搜索下一队。
if(!visit[dif[y].a]&&!visit[dif[y].b]&&!visit[dif[y].c]){
visit[dif[y].a] = visit[dif[y].b] = visit[dif[y].c]=1;
dfs(x+1,y+1);
visit[dif[y].a] = visit[dif[y].b] = visit[dif[y].c]=0;
}
else{
dfs(x,y+1);
}
}

int main(){
int temp=0;
string str1,str2,str3;
cin>>n;
for(int i=1;i<=n;i++){
cin>>str1>>str2>>str3;   //利用 map  直接将重复元素滤去

if(!q[str1]){   //选择不重复的 string,匹配 int后, 作为q的新元素
temp++;
q[str1] = temp;
}
if(!q[str2]){
temp++;
q[str2] = temp;
}
if(!q[str3]){
temp++;
q[str3] = temp;
}
dif[i].a = q[str1];
dif[i].b = q[str2];
dif[i].c = q[str3];
}
//如此就将人名映射成不同的数字  ,然后在 visit[]中计入是否已经访问过。

for(int i=1;i<= n;i++){
visit[dif[i].a] = visit[dif[i].b] = visit[dif[i].c] = 1;
dfs(1,i+1);
visit[dif[i].a] = visit[dif[i].b] = visit[dif[i].c] = 0;
}
cout<<result<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: