算法问题实战策略 PICNIC
下面是另一道搜索题目的解答过程
题目是《算法问题实战策略》中的一题
oj地址是韩国网站 连接比较慢 https://algospot.com/judge/problem/read/PICNIC
大意如下

输入 输出
也是上来就撸一把DFS
全部能够匹配完成则计数增加1
但是有很多重复计算
我试过记录关系对的时候 以数值大小为序 只能排除一部分重复计算
错误的代码:
#include <iostream>
#include <vector>
#include <algorithm> using namespace std; /*
3
2 1
0 1
4 6
0 1 1 2 2 3 3 0 0 2 1 3
6 10
0 1 0 2 1 2 1 3 1 4 2 3 2 4 3 4 3 5 4 5
//====================================
1
3
4
*/ int t;
int a, b;
int n, m;
typedef pair<int, int> PII; bool isFriend(int i, int j, const vector<PII>& friendv)
{
int minIdx = min(i, j);
int maxIdx = max(i, j); for (auto& e : friendv) {
if (e.first == minIdx && e.second == maxIdx)
return true;
} return false;
} int dfs(bool isChecked[],const vector<PII>& friendv)
{
int firstFree = -;
for (int i = ; i < n; i++) {
if (isChecked[i] == false){
firstFree = i;
break;
}
} if (- == firstFree)
return ; int ret = ; for (int secondFree = firstFree + ; secondFree < n; secondFree++) {
if (firstFree != secondFree && isChecked[firstFree] == false && isChecked[secondFree] == false
&& isFriend(firstFree, secondFree, friendv)) {
isChecked[firstFree] = true; isChecked[secondFree] = true;
ret += dfs(isChecked, friendv);
isChecked[firstFree] = false; isChecked[secondFree] = false;
}
} return ret;
} int main()
{
cin >> t; while (t--) {
cin >> n >> m;
vector<PII> friendv;
bool isChecked[] = {false};
while (m--) {
cin >> a >> b;
friendv.push_back({min(a,b),max(a,b)});
}
sort(friendv.begin(), friendv.end());
cout << dfs(isChecked, friendv);
} return ;
}
经过调试 发现DFS中双重循环有很大问题
i=0时候检测出 0 1配对 然后检测出2 3 配对.
但是当i=2时 也能检测2 3 配对 以及 0 1 配对。
于是做了以下修改,解决重复问题
ac代码
#include <iostream>
#include <vector>
#include <algorithm> using namespace std; /*
3
2 1
0 1
4 6
0 1 1 2 2 3 3 0 0 2 1 3
6 10
0 1 0 2 1 2 1 3 1 4 2 3 2 4 3 4 3 5 4 5
//====================================
1
3
4
*/ int t;
int a, b;
int n, m;
typedef pair<int, int> PII; bool isFriend(int i, int j, const vector<PII>& friendv)
{
int minIdx = min(i, j);
int maxIdx = max(i, j); for (auto& e : friendv) {
if (e.first == minIdx && e.second == maxIdx)
return true;
} return false;
} int dfs(bool isChecked[],const vector<PII>& friendv)
{
int firstFree = -;
for (int i = ; i < n; i++) {
if (isChecked[i] == false){
firstFree = i;
break;
}
} if (- == firstFree)
return ; int ret = ; for (int secondFree = firstFree + ; secondFree < n; secondFree++) {
if (firstFree != secondFree && isChecked[firstFree] == false && isChecked[secondFree] == false
&& isFriend(firstFree, secondFree, friendv)) {
isChecked[firstFree] = true; isChecked[secondFree] = true;
ret += dfs(isChecked, friendv);
isChecked[firstFree] = false; isChecked[secondFree] = false;
}
} return ret;
} int main()
{
cin >> t; while (t--) {
cin >> n >> m;
vector<PII> friendv;
bool isChecked[] = {false};
while (m--) {
cin >> a >> b;
friendv.push_back({min(a,b),max(a,b)});
}
sort(friendv.begin(), friendv.end());
cout << dfs(isChecked, friendv)<<endl;
} return ;
}
算法问题实战策略 PICNIC的更多相关文章
- 《算法问题实战策略》-chaper7-穷举法
关于这一章节<算法实战策略>有一段概述问题,我认为对于编程人员来说非常有价值,故在这里进行如下的摘抄: 构想算法是很艰难的工作.相比大家都经历过,面对复杂的要求只是傻乎乎地盯着显示器,或者 ...
- 《算法问题实战策略》-chaper32-网络流
基本的网络流模型: 在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”. 流问题的基本概念: 首先给出一张图. 其实所谓 ...
- 《算法问题实战策略》-chaper13-数值分析
这一章节主要介绍我们在进行数值分析常用的二分.三分和一个近似求解区间积分的辛普森法. 首先介绍二分. 其实二分的思想很好理解并且笔者在之前的一些文章中也有所渗透,对于二次函数甚至单元高次函数的零点求解 ...
- 《算法问题实战策略》——chaper9——动态规划法技巧
Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1) 拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2) 棋盘中还剩 ...
- 《算法问题实战策略》-chaper8-动态规划法
Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...
- 《算法问题实战策略》-chaper21-树的实现和遍历
这一章节开始介绍一个数据结构中的一个基本概念——树. 我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列.数组和链表等结构表征),还有一个重要的特性——层级结构 ...
- 算法问题实战策略 QUADTREE
地址 https://algospot.com/judge/problem/read/QUADTREE 将压缩字符串还原后翻转再次压缩的朴素做法 在数据量庞大的情况下是不可取的 所以需要在压缩的情况下 ...
- 算法问题实战策略 DICTIONARY
地址 https://algospot.com/judge/problem/read/DICTIONARY 解法 构造一个26字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...
- 算法问题实战策略 MEETINGROOM 附一份tarjan模板
地址 https://algospot.com/judge/problem/read/MEETINGROOM 解答 2-sat 代码样例过了 没有ac. 我又没有正确代码对拍..... 已确认是输出 ...
随机推荐
- 一个随机切换user_agent的第三方python库:my_fake_useragent
因为my_fake_useragent 是第三方,所以需要自己进行安装. 不用担心,它没有任何依赖或者附加环境,只安装它自己就行. 方法1: pycharm传统安装方式. 方法2: pip insta ...
- 基于Git的数据库sql文件的管理——完美解决团队sql操作协同问题
目录 基于Git的数据库sql文件的管理--完美解决团队sql操作协同问题 1.产生背景 2.之前没用Git管理数据库出现的问题 2.1 用同一个库调试带来的问题 3.解决方案 3.1 Sql文件的创 ...
- GitLab-怎样使用GitLab托管项目
场景 Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- 前端面试题套路--终极版(Vue、JavaScript)
前言 面试题是永远都准备不完的!!!!! 前端常见的一些问题 1.前端性能优化手段? 1. 尽可能使用雪碧图 2. 使用字体图标代替图片 3. 对HTML,css,js 文件进行压缩 4. 模块按需加 ...
- Cesium专栏-填挖方分析(附源码下载)
Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...
- Custom Diagrams
Custom Diagrams https://github.com/dbeaver/dbeaver/wiki/Custom-Diagrams You can create custom ER dia ...
- You don't have permission to access / on this server,Forbidden
wampserver配置虚拟主机Forbidden,apache You don't have permission to access 找到httpd.conf文件(通常在安装apache的conf ...
- python检查字典元素是否存在类似php中isset()方法
PHP中isset()方法来检查数组元素是否存在,在Python中无对应函数,在Python中一般可以通过异常来处理数组元素不存在的情况,而无须事先检查 Python的编程理念是“包容错误”而不是“严 ...
- Mac录制或保存视频后如何放大?
想要在录制和拍摄视频后在喜欢的场景(例如Mark)中放大视频吗?本文将向您展示如何放大视频并通过裁剪视频和“平移和缩放”效果来制作Ken Burns效果.Filmora9是一款功能强大的视频编辑器,具 ...
- quarter软件的破解
链接;http://www.openedv.com/forum.php?mod=viewthread&tid=275857&extra=page%3D1 这个是正点原子提供的破解方法, ...