dfs

poj1691--Painting A Board(拓扑+dfs)

孤人 提交于 2020-03-05 08:52:08
题目链接: 点击打开链接 题目大意:一个矩形由n个小矩形组成,如今要给小矩形染色,可是颜料会向下滑,为了防止弄乱颜料,所以要先染上面的矩形,后然染以下的矩形。每一次改变颜色都要用一个新的刷子。问最小用多少刷子。 依照染色的条件。能够找到一个拓扑序列,拓扑序列中前面的要先染。后面的要后染,按拓扑的顺序dfs找出最少的刷字数。 #include <cstdio> #include <cstring> #include <vector> #include <stack> #include <algorithm> using namespace std ; struct node{ int y1 , x1 , y2 , x2 , c ; }p[20]; vector <int> vec[20] ; int sta[20] , k ; int in[20] , min1 , n ; int vis[20] ; int cmp(node a,node b) { return a.y1 < b.y1 ; } void dfs(int c,int num,int ans) { if( ans > min1 ) { return ; } if( num == n ) { min1 = ans ; return ; } int i , j , l ; for(i = 0 ; i < n ; i++)

数位DP入门

浪子不回头ぞ 提交于 2020-03-05 06:58:54
考试考dp的时候时常会碰见有关数位dp的问题,每次考到就是一脸懵逼加吃惊,所以今天抽空看了一下有关数位dp的知识,网上有很多大神都说的很好,推荐看几篇blog。 入门经典 慢慢看,很不错 数位DP的套路 数位dp其实看了那么多篇blog感觉就是一个套路,一个记忆化搜索,方法无非是用两个端点的答案相减得到答案。dp主要考得是状态的设定和转移及其优化,对于数位dp来说,转移和优化其实是固定的,变的只是状态的设定,把状态设好了,套上板子处理下边界和正确性就好了,感觉还是要多做题,先贴两道题,之后慢慢更新,可以去vj上坐kuangbin带你飞系列的数位dp专题,题目很适合入门的人。 HDU2089 题面 统计区间 [a,b] 中不含 4 和 62 的数字有多少个。 分析 这其实是一道模板题看了上面两篇blog的做这题会很简单,部分注释写在代码里了。 /************************************************************************* > Author: Drinkwater > Created Time: 2017/8/24 21:55:11 ************************************************************************/ #include<iostream>

hdu1814 Peaceful Commission

狂风中的少年 提交于 2020-03-05 06:18:24
hdu1814 Peaceful Commission 题意:2-sat裸题,打印字典序最小的 我写了三个 染色做法,正解 scc做法,不管字典序 scc做法,错误的字典序贪心 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int N = 2e4+5, M = 1e5+5; inline int read() { int x = 0, f = 1; char c = getchar(); while(c<'0' || c>'9') {if(c=='-') f=-1; c=getchar();} while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();} return x * f; } int n, m; struct edge {int v, ne;} e[M]; int cnt, h[N]; inline void ins(int u, int v) { e[++cnt] = (edge) {v, h[u]}; h[u] = cnt; } inline int id(int x) {return ((x-1)^1)+1;} int col

二分匹配模板

和自甴很熟 提交于 2020-03-05 06:02:16
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <vector> 5 #include <algorithm> 6 using namespace std; 7 /****************************************************** 8 * 二分图匹配(匈牙利算法得邻接矩阵+dfs实现) 9 * 初始化:g[][]两边顶点的划分情况 10 * 建立g[i][j]表示i->j的有向边就可以了,是左边向右边的匹配 11 * g 没有边相连则初始化为0 12 * //un是匹配左边的顶点数,vn是匹配右边的顶点数 13 * 调用:res = hungray():输出最大匹配 14 * 优点:适用于稠密图,dfs找增广路,实现简洁易于理解 15 * 时间复杂度:O(V,E)。 16 * 顶点编号从0开始 17 const int maxn = 500 + 5; 18 int un, vn;//二分图中u, v的数目,使用前必须赋值 19 int g[maxn][maxn]; 20 int linker[maxn];//每个结点的匹配结点 21 bool used[maxn]; 22 23 bool dfs(int u) { 24 for(int v = 0;

HDU - 5971 Wrestling Match(DFS 二分图染色)

早过忘川 提交于 2020-03-04 23:41:18
Sample Input 5 4 0 0 1 3 1 4 3 5 4 5 5 4 1 0 1 3 1 4 3 5 4 5 2 Sample Output NO YES题意:有n个人,有m场比赛,有x个好人,y个坏人,需要根据下面的m场比赛,确认是否可以将n个人划分为好人还是坏人。不一定要知道这个人到底是属于好人还是坏人,主要看能否划分为两个群体,就和二分图匹配一样。如果有一个人没参加比赛也不知道是不是好人,就是No,出现了矛盾的地方也是NO。思路:首先将已确定为好人还是坏人的人连接点找出,染上相反的颜色。然后其他联通块也遍历过去,不知道是谁就染1,如果出现两个连接点数字相同肯定是错的。代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #pragma GCC optimize(2) #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<queue> #include<set> #include<cmath> #include<string> #include<map> #include<vector> #include<ctime> #include<stack> using namespace std;

leetcode(46)- 全排列

时光总嘲笑我的痴心妄想 提交于 2020-03-04 19:07:47
46. 全排列 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] ] 思路 这题目很熟悉吧,小学数学,这跟昨天写的leetcode39题很像,而且比39题容易了许多,同样的这种设计到列举全部组合的问题可以画树来解决: 可以看到,舍弃的条件是: 1、搜索长度已经达到树的深度。 2、搜索过程中如果有重复。 那么自然就是套用我们的dfs模板就行了 void dfs ( int step ) { if ( 满足终止搜索条件 ) { 终止搜索 , 记录数据 ; return ; } 尝试每一种搜索可能 { if ( 不满足继续搜索的条件 ) { 跳过这一种搜索可能 ; } 记录搜索数据 ; 继续下一步 dfs ( step + 1 ) ; 恢复初始状态(回溯的时候要用到) ; } } 实现代码 class Solution { public List < List < Integer > > permute ( int [ ] nums ) { List < List < Integer > > res = new ArrayList < > ( ) ; int len = nums . length ; dfs ( 0 , nums , len ,

sgu 321 The Spy Network (dfs+贪心)

人盡茶涼 提交于 2020-03-04 15:31:22
321. The Spy Network Time limit per test: 0.5 second(s) Memory limit: 65536 kilobytes input: standard output: standard The network of spies consists of N intelligence officers. They are numbered with the code numbers from 1 to N so that nobody could discover them. The number 1 belongs to the radiowoman Kat. There is exactly N - 1 communication channels between the spies. It is known that a message from any spy to Kat can reach her. All channels are unidirectional. A channel can have one of two types: protected and almost protected. It is known that a message will not be intercepted almost

【Gym - 101164I】Cubes(dfs,剪枝)

試著忘記壹切 提交于 2020-03-04 07:45:39
BUPT2017 wintertraining(15) #4 A - I.Cubes Gym - 101164I 题意 将n拆成最少个立方数相加的形式。 题解 根据n的范围,立方数最大不超过400的立方,并且个数也不会很多。 dfs,设置一个深度的上限up。从大到小枚举立方数,剪枝条件:当前层数加上至少还需要的层数>=up就return。 代码 #include <cstdio> #include <cstring> using namespace std; int n,c[500],a[101],ans[1001],up=50; void dfs(int d,int x,int k){ if(x==0){ up=d; for(int i=1;i<=d;i++)ans[i]=a[i]; } if(d+1>=up||d+x/c[k]>=up)return; for(int i=k;i;i--)if(c[i]<=x){ a[d+1]=i; dfs(d+1,x-c[i],i); } } int main() { for(int i=1;i<=400;i++)c[i]=i*i*i; scanf("%d",&n); dfs(0,n,400); printf("%d\n",up); for(int i=1;i<=up;i++)printf("%d ",ans[i]); return 0; }

ZJYYOJ 组数总和(dfs)[C,C++]

馋奶兔 提交于 2020-03-04 03:19:22
目录 题目及翻译 题面 输入 输出 输入样例 输出样例 题目思路 注意事项 AC代码 C/C++(几乎没有代码变更) 题目及翻译 题面 LZY今天又突发奇想了,他想随意给出两个数字n和k,请你找出所有N个数字相加和为K的组合数量。组合中只含有1——9的数字,并且不允许重复。 输入 测试样例由多组测试数据组成。每组测试样例第一行输入两个正整数n ( 1 <= n <= 9 ) 和 k < ( 1 <= k <= 45 )。 输出 输出所有符合题目要求的组合数量。如果组合不存在,请输出 No list 输入样例 3 7 3 9 输出样例 1 3 题目思路 给学弟学妹写篇题解,小不点们加油!! 有不懂的地方欢迎留言或者微信找我询问~ 题目要求里已经写清楚退出条件了, 刚好用 n 个数字 且 总和为 k 那么我们只需要记录三个值,一个是当前值,一个是当前总和,一个是当前数字数量 有几个剪枝优化: 1:如果当前没有到达正确答案,那么 步数 大于等于 n 都意味着之后没可能了 2:如果当前没有到达正确答案,那么 总和 大于等于 k 都意味着之后没可能了 3:从当前值 + 1 开始从小到大搜索,这样就不用再标记是否有数字被用过,因为逼自己小的数字都已经在之前的计算中算完了 注意事项 没有可能时,要输出No list 我没看仔细题目就栽在这了 AC代码 C/C++(几乎没有代码变更) 用时0MS

POJ 1691 Painting A Board(DFS)

老子叫甜甜 提交于 2020-03-03 22:39:14
链接 题意 : 看了好长时间终于看懂题目了,将一个大矩形划分成若干小矩形,告诉你每个小矩形的左上角那个点和右下角那个点的坐标,告诉你这个小矩形要涂的颜色,每个颜色对应一个刷子,问你最少要使用几次刷子。因为你要刷一个矩形之前,必须把这个矩形上方与之直接相邻的所有矩形先刷掉才能刷这个,如果你先用了红色的刷子,然后又用了蓝色的刷子,最后又用了红色的刷子,这算是3次使用而不是两次,样例中,用红色刷B所以D也可以刷了,用蓝色先刷A,然后可以刷C,因为B刷了所以E也可以刷了,最后换刷子把剩下的刷掉,总共三次。 思路 : 这个题可以用DFS也可以用状压DP,我用的DFS,因为没压出来,,,,,,,这里有分析, 链接1 , 链接2 。先将每个矩形看成一个点,然后如果存在上下关系的话,下边那个点的入度+1,先找入度为0的点开始染色,如果这个点已经染掉了的话,那它下边的点入度要减1.。。。。。。。 1 //1691 2 #include <stdio.h> 3 #include <string.h> 4 #include <iostream> 5 6 using namespace std ; 7 8 struct rectangle 9 { 10 int lx,ly ; 11 int rx,ry ; 12 int R ; 13 } rec[16]; 14 int degree[16] ; 15