部落卫队 解题报告
2015-08-13 09:52
197 查看
部落卫队
【问题描述】
原始部落byteland中的居民们为了争夺有限的资源,经常发生冲突。几乎每个居民都有他的仇敌。部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何2 个人都不是仇敌。
【编程任务】
给定byteland部落中居民间的仇敌关系,编程计算组成部落卫队的最佳方案。
【输入格式】
第1行有2个正整数n和m,表示byteland部落中有n个居民,居民间有m个仇敌关系。居民编号为1,2,…,n。接下来的m行中,每行有2个正整数u和v,表示居民u与居民v是仇敌。
【输出格式】
第1行是部落卫队的顶人数;文件的第2行是卫队组成x i,1≤i≤n,xi =0 表示居民i不在卫队中,xi=1表示居民i在卫队中。
【输入样例】
7 10
1 2
1 4
2 4
2 3
2 5
2 6
3 5
3 6
4 5
5 6
【输出样例】
3
1 0 1 0 0 0 1
【解题思路】
再次感谢fye的帮助!!!!!(有学姐就是好\(^o^)/~)
仇敌的关系存一下;
f[i]表示编号为i的这个人是不是部落卫队的仇敌,,如果是的话就不能选;
因为一个人也许是很多个人的仇敌,所以f[i]设置成一个计数器,是一个人的仇敌就+1;
搜索过程中要剪枝;
【代码】
【问题描述】
原始部落byteland中的居民们为了争夺有限的资源,经常发生冲突。几乎每个居民都有他的仇敌。部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何2 个人都不是仇敌。
【编程任务】
给定byteland部落中居民间的仇敌关系,编程计算组成部落卫队的最佳方案。
【输入格式】
第1行有2个正整数n和m,表示byteland部落中有n个居民,居民间有m个仇敌关系。居民编号为1,2,…,n。接下来的m行中,每行有2个正整数u和v,表示居民u与居民v是仇敌。
【输出格式】
第1行是部落卫队的顶人数;文件的第2行是卫队组成x i,1≤i≤n,xi =0 表示居民i不在卫队中,xi=1表示居民i在卫队中。
【输入样例】
7 10
1 2
1 4
2 4
2 3
2 5
2 6
3 5
3 6
4 5
5 6
【输出样例】
3
1 0 1 0 0 0 1
【解题思路】
再次感谢fye的帮助!!!!!(有学姐就是好\(^o^)/~)
仇敌的关系存一下;
f[i]表示编号为i的这个人是不是部落卫队的仇敌,,如果是的话就不能选;
因为一个人也许是很多个人的仇敌,所以f[i]设置成一个计数器,是一个人的仇敌就+1;
搜索过程中要剪枝;
【代码】
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,i,ans,maxn,x,y; int a[100][100],b[100],d[100],f[100]; void dfs(int dep) { int r; if (dep==n+1) { if (maxn>ans)//这里不难理解 { ans=maxn; for (i=1;i<=n;++i) d[i]=b[i]; } return; } if (maxn+n-dep+1<ans) return;//最优化剪枝,如果当前选好的人加上还没有搜索到的人还小于当前已知的最大值的话, if (!f[dep]) //就直接退出,不用继续搜索了 { b[dep]=1; maxn++; for (r=1;r<=n;++r)//选了一个人,那就把他所有的仇人的f[i]+1 if (a[dep][r]==1) f[r]++;//巧妙之处!!! dfs(dep+1); for (r=1;r<=n;++r)//回溯一步 if (a[dep][r]==1) f[r]--; maxn--; } b[dep]=0;//这是当前的人不选的情况,直接搜索下一层 dfs(dep+1);//dep是按人搜索 } int main() {<span style="font-family: Arial, Helvetica, sans-serif;"> </span> scanf("%d%d",&n,&m); for (i=1;i<=m;++i) { scanf("%d%d",&x,&y); a[x][y]=1;//存储仇敌关系 a[y][x]=1; } dfs(1); printf("%d\n",ans); for (i=1;i<=n;++i) printf("%d ",d[i]); return 0; }
相关文章推荐
- ScrollView反弹效果的实现
- SSM后台管理系统(Spring SpringMVC Mybatis Mysql EasyUI)
- zoj 3175 Number of Containers 分块加速
- Struts 2中 Constant详解
- 采用CAS原理构建单点登录
- incompletetype.c:6: error: dereferencing pointer to incomplete type.
- 网络连接之Http及异步操作AsyncTask
- maven项目配置文件路径的修改
- 数据库培训知识
- 求A^B的所有约数和 POJ1845
- java 后台开发关键词解释
- A题之NowCoder数列
- 自定义leftBarButtonItem的右滑回退功能首页右滑界面卡死解决
- Win10系统下Genymotion无法打开该怎么办?
- swift -变量的定义与使用
- MFC自动获取网络地址函数实现----广播地址,网关,子网掩码
- CSU 1004 Xi and Bo
- 九度 Online Judge 算法 刷题 题目1013:开门人和关门人
- C++中各种类型修饰符汇总
- 照片教你eclipse通过使用gradle 打包Android