搜索
FightingForFinal
这个作者很懒,什么都没留下…
展开
-
输出组合排列的方案
组合排列数值公式 要求输出具体方案用dfs实现非常简单,这里只针对不同元素#include<iostream>#include<algorithm>using namespace std;int a[100];int n,m;int path[100];void dfs(int cur,int len){ if(len==m){ for(int i=0;i<len;原创 2015-09-17 15:50:25 · 369 阅读 · 0 评论 -
poj1011Sticks(dfs+剪枝)
将n(n<=64)个木棒拼接成若干等长的木棒,要求等长的木棒越短越好(设为len)。 一看就是一个复杂度为O(n!)的dfs,肯定会超时,所以要加上一些剪枝才行。由于木棒越长越不灵活,所以要优先考虑,因此将木棒降序排序。搜索中如果当前拼接的木棒总长再接上一根木棒x之后长度为len,这种方案最终不成功,那么比x短的木棒不再考虑。如果拼接过程中一根都没拼,最终却失败,那么别的木棒不再考虑。如果原创 2016-07-29 15:24:32 · 351 阅读 · 0 评论 -
最近公共祖先lca离线
利用dfs和并查集实现点对的最近公共祖先,首先递归到叶子节点,然后在返回时确定父子关系,按照这样的顺序确定的父子关系之后出现的公共父节点便是最近公共祖先#include<bits/stdc++.h>using namespace std;const int maxn=1000;const int maxm=1000;int lca[maxn+5][maxn+5];vector<int>nxt原创 2016-07-27 20:33:14 · 260 阅读 · 0 评论 -
取若干个数求和等于k
51nod1268 和为K的组合 方法一:由于k最大取到20*1000000,所以用01背包可以解决,复杂度O(n * k)#include<bits/stdc++.h>using namespace std;int a[25];int n,k;int f[1000000+5];int main(){ ios::sync_with_stdio(false); cin>>n>原创 2016-07-02 22:48:24 · 1018 阅读 · 0 评论 -
POJ2456 二分搜索
POJ2456 Aggressive cows 题意:有N间牛舍,牛舍被排在一条线上,第i号牛舍在xi的位置。但是他的M头牛对小屋很不满意,因此经产互相攻击。为了防止牛之间互相伤害,因此决定把每头牛都放在离其他牛尽量远的牛舍。也就是要最大化最近的两头牛之间的距离。 关于最小值最大化或者最大值最小化的问题,通常用二分搜索法。#include<cstdio>#include<algorithm>原创 2015-09-17 15:39:42 · 360 阅读 · 0 评论 -
UVa208 消防车 (dfs+并查集)
UVa208 Firetruck 题意:一个n(n<=20)个结点的无向图,要求打印从结点1到结点k的所有路径。 解法:简单的dfs,但是会超时,因为有些结点不能到达k,所以搜索这些结点完全是多余的,可以用并查集将能到达k的结点放入一个集合,搜索这些结点就可以了。#include<cstdio>#include<cstring>#include<iostream>using namespa原创 2016-03-14 16:40:59 · 873 阅读 · 0 评论 -
二维矩阵的一维访问方式
HDU1045Fire Net题意:点代表空地,X代表墙。问空地最多能放置多少个炮(炮能够向上下左右四个方向打,但是墙打不穿),使互相攻击不到?简单dfs,递归深度就是炮的个数,不过二维矩阵的访问方式要变成一维的,从1到n*n的方式访问,可以避免大量重复#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>usi原创 2015-12-09 13:55:09 · 596 阅读 · 0 评论 -
HDU4135 容斥原理+质因子+DFS
HDU4135Co-prime 题意:求区间[A , B]内与N互质的数的个数分析: 将问题转换一下,用[1 , B]内与N互质的数的个数减去[1 , A-1]内与N互质的数的个数,现在就变成要求[1 , C]内与N互质的数的个数,这样不好求,但是求与N互质的数的个数(设为num)很简单,那么最后答案就是C-num 如何求与N不互质的数的个数: 比如C=12,N=30 第一步:求出N的所有原创 2015-10-27 18:31:09 · 422 阅读 · 0 评论 -
输出全排列的方案
全排列数值有公式 非常简单 但是要求输出具体方案怎么办呢? 用dfs实现很简单,这里只针对不同元素的全排列,有相同的再另外考虑吧#include<iostream>#include<algorithm>using namespace std;int a[100],visited[100]={0};int n,m;int path[100];void dfs(int cur,int len原创 2015-09-17 15:49:56 · 366 阅读 · 0 评论 -
HDU1518 Square
HDU1518 Square 一般的DFS是搜索到一条满足就行了,这种题目是搜索多条满足题意:用上所有的长度组合成四条相等的边长#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int a[30],visited[30];int n,W;int flag;void dfs(int cur,i原创 2015-09-17 15:48:55 · 374 阅读 · 0 评论 -
HDU1157 连连看
HDU1157 连连看DFS 测试样例: 样例1: 3 2 0 1 0 2 0 1 1 1 2 3 2 YES样例2: 1 3 2 2 2 1 1 1 3 3 NO主要是解决初始方向问题就OK了#include<cstdio>#include<cstring>#include<cstdlib>using namespace std;struct V{ in原创 2015-09-17 15:48:19 · 303 阅读 · 0 评论 -
二分图判定
如果图中的点可以划分成两个集合使得集合内部的点之间没有边相连。 判定方法就是二色染色法,将一个点染成一种颜色,与之相邻的点染成另一种颜色,如果发现相邻两点颜色相同,则不是二分图。#include<bits/stdc++.h>using namespace std;const int maxn=1000;vector<int>nxt[maxn+5];int vis[maxn+5];bool d原创 2016-07-29 19:49:23 · 350 阅读 · 0 评论