ural 1208 Legendary Teams Contest
2015-08-30 21:02
281 查看
题意描述:给定K支队伍,每队三个队员,不同队伍之间队员可能部分重复,输出这些队员同时能够组成多少完整的队伍;
DFS,利用DFS深度优先搜索,如果该队所有队员都没有被访问过,那么将该队计入结果,再去选择下一队~
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; }
相关文章推荐
- Opencv离散傅里叶变换
- 列表下拉/上拉刷新: (一)EGORefreshTableHeaderView使用、定义EGORefreshTableFooterView
- idea中output log4j中文乱码
- 九、MDT 2013 Update 1批量部署-第三方PXE无盘网络启动配套使用
- Ubuntu下LAMP环境搭建
- Android之 ListActivity 的使用和在 ListView中添加图片文字(ListActivity与Activity的区别)
- Block的认识和使用
- Programming STM32-Discovery using GNU tools. Startup code
- Opencv用指针访问像素
- 生命的乐趣。
- java框架集合
- HDU1022 Train Problem I
- 二十年目睹之怪状-男女失调不能怪计划生育
- NYOJ 311 完全背包(完全背包)
- centos7安装java
- JavaScript对象复习
- 队列的链表实现
- shell模拟双色球开奖
- nyoj 755 山谷 【水题】
- 排序算法小结-归并、基数排序