DFS
文章平均质量分 57
无敌大饺子
这个作者很懒,什么都没留下…
展开
-
ZOJ 2110 Tempter of the Bone
一道很好的DFS题目#include #include #include #include #include using namespace std;const int maxn=7;bool vis[maxn][maxn];char maze[maxn][maxn];int di[]={-1,1,0,0},dj[]={0,0,-1,1},n,m,t,ti,tj;boo原创 2013-04-03 20:37:12 · 362 阅读 · 0 评论 -
HDU 1520 Anniversary party(树形DP入门)
d[i][0]表示i结点参加party而i结点儿子结点不参加 转移:d[i][0]=rating[i]+sum(dp[j][1]) i结点的rating加上所有的儿子结点不参加的值d[i][1]表示i结点不参加而让儿子结点门选择参加或者不参加 转移d[i][1]=sum(max(dp[j][0],dp[j][1])) i结点不参加的值为所有儿子结点的参加或者不参加的最大值的和#includ原创 2013-04-27 22:45:20 · 522 阅读 · 0 评论 -
ZOJ 2411 Link Link Look(DFS)
看到这题目名字有点逗.刚开始用bfs没成功,主要是不知道怎么判重,单纯判断是否访问过是不行的.换成dfs过了.注意边界是可以走的.#include #include #include #include using namespace std;const int maxn=103;int grid[maxn][maxn],di[]={0,0,1,-1},dj[]={1原创 2013-04-29 13:14:30 · 607 阅读 · 0 评论 -
ZOJ 3300 Mahjong(DFS)
枚举1-9搜索就可以了.#include #include #include using namespace std;int tiles[10];bool dfs(int curi,int melds,int eye){ if(melds==4&&eye==1)return true; if (curi>=10||eye>1||melds>4)return false; int原创 2013-04-30 14:03:03 · 513 阅读 · 0 评论 -
ZOJ 3305 Get Sauce(DFS+剪枝)
首先对方式按照材料分类.然后排序再搜索,详细的看注释.跑了1.9秒多,可能还有其他的剪枝吧.#include #include #include #include #include #include using namespace std;const int maxn=17;vectorv1[maxn];//需要这种材料的方式vectorv2[50010];//原创 2013-04-30 16:23:49 · 645 阅读 · 0 评论 -
ZOJ 3201 Tree of Tree(树形背包DP)
dp[i][j]表示在i结点上选择j个结点能获得的最大值,j的值最大自然是以i为根的子树的结点数量.dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[v][k])//方程意义就是在i结点上选择j个点的最优值等于 max(当前值,在i的一颗子树上选择j-k个结点+在i的子树v上选择k个点) (k=1 2 ... j-1).枚举j和k.j-1因为必须要把i算进去#in原创 2013-04-29 16:00:27 · 626 阅读 · 0 评论 -
ZOJ 2682 People like People(DFS)
首先进行删点操作.对于入度为0的点u 删除点u, 将u的邻接点的入度减1,一直删除直到不存在入度为0的点..(保证了每个点都被别人喜欢)对于出度为0的点u 删除点u,并删除所有连接到点u的点,一直删除直到没有出度为0的点.(保证了每个点都喜欢别人)然后对(正图和反图合并)进行DFS,找出结点数最多的分量,输出结果.#include #include #include #i原创 2013-05-17 21:09:32 · 745 阅读 · 0 评论 -
ZOJ 1539 Lot(DFS)
直接照着题意搜了.#include #include #include using namespace std;int ans,n;void dfs(int c){ if(c == 3){ ans++; }else if(c < 3){ return; } if(c % 2){ //当前数量是奇数 dfs(c - c / 2); //偶数 dfs(原创 2013-05-05 22:32:44 · 737 阅读 · 0 评论 -
ZOJ 2734 Exchange Cards(DFS)
本以为这样搜索可能过不了,交了之后发现数据很弱.#include #include using namespace std;const int maxn = 11;int val[maxn],num[maxn];int n, m, ans;void dfs(int cnt, int ci){ if(cnt > n)return; else if(cnt == n){ ans原创 2013-05-24 16:39:20 · 502 阅读 · 0 评论 -
ZOJ 1168 Function Run Fun
看到题目第一想法就是记忆化搜索,然后就写了.#include #include #include #include using namespace std;int dp[21][21][21];int w(int a, int b, int c){ if(a <=0 || b<= 0 || c<=0){ return 1; } else if( a > 20 || b原创 2013-05-14 09:23:16 · 502 阅读 · 0 评论 -
ZOJ 1798 Granny's Bike
哈密尔顿回路问题,n比较小,可以用搜索解决.#include #include #include using namespace std;const int maxn = 11;int g[maxn][maxn], n;bool vis[maxn];bool dfs(int u, int left){ if(left == 0 && u == 0){ return tr原创 2013-05-14 13:35:52 · 810 阅读 · 0 评论 -
ZOJ 2358 Sum of Factorials
回溯法打表下,就可以了.#include #include using namespace std;const int tb[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};bool ans[1000001];int n;void dfs(int ci,int sum){ ans[sum] = 1; if(ci >=原创 2013-05-14 16:10:25 · 555 阅读 · 0 评论 -
ZOJ 2500 Median Weight Bead
分别保存两个图,第一个图表示u大于v,第二个图为反向图,表示u小于v.然后用floyd或者dfs求出这两个图各个顶点的能到达的结点数量,如果某个点数量大于n/2说明这个数不可能成为中位数.#include #include #include const int maxn = 105;int g1[maxn][maxn], g2[maxn][maxn], n, m;bool原创 2013-05-15 13:43:23 · 524 阅读 · 0 评论 -
LA 3902 Network
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1903首先把无根树转换成以s为根的树,然后dfs,对叶子结点按照深度分类,顺便求出每个结点的父节点然后对于每一个深度为d叶子节点,求出它的第d祖先,然后对这个祖先再次进行dfs把这个祖原创 2013-06-01 12:15:58 · 703 阅读 · 0 评论 -
UVA 10318 Security Panel
搜索题.剪枝1.如果当前点的左上一个点是空,或者当前点是最右边的点并且上面一个点是空,剪掉剪枝2.如果当前需要点亮的点数量大于等于最小值的点数量,剪掉.#include #include #include using namespace std;const int maxn = 6;char pt[maxn][maxn];char map[maxn][maxn];int原创 2013-06-13 10:22:40 · 413 阅读 · 0 评论 -
蓝桥杯练习系统 PREV-4 剪格子
搜索题.几处剪枝的地方:1.当前和s大于总的和减去s,没有必要继续搜下去.2.当前使用的格子大于等于最优解,没有必要继续搜下去.下面的程序可能会剪成3部分,可是还是过了,不知为什么.#include #include #include using namespace std;const int MAX = 11;bool vis[MAX][MAX];int n, m原创 2014-03-17 15:53:16 · 500 阅读 · 0 评论 -
ZOJ 1003 Crashing Balloon(DFS)
两个数A,B能不能通过1-100内的数相乘得到,每个数只能用一次,并且两个数不能有除了1之外的公共因子.3种情况:1.k做A的因子.2.k做B的因子.3.k不做任何数的因子.#include #include #include using namespace std;const int MAX = 102;bool vis[MAX], madeit;bool dfs原创 2014-03-31 22:08:13 · 401 阅读 · 0 评论 -
ZOJ 2111 Starship Troopers(树形DP)
dp[i][j]表示在i结点上放置j个士兵能获得的最多brains数量,注意士兵并不是只能待在一个房间里,他可以把当前房间清理完,但只能往下面走.dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[v][k])当前位置i上放j个士兵和当前位置上放j-k个士兵,下一个房间放k个士兵的最大值#include #include #include #include us原创 2013-04-28 15:41:17 · 568 阅读 · 0 评论 -
HDU 2196 Computer(树形dp)
dp1表示i结点的子树的最长距离,dp2表示i结点的子树的次长距离,dp3表示i结点通过父节点再到父节点的另一颗子树的最长距离,maxd表示i的最长路径的下一个结点.首先进行一次从叶结点到根的dfs,求出各个点的子树的最长距离和次长距离然后再进行一次从根节点到叶结点的dfs,求出每个结点通过其父节点的能够得到的最大距离:1.设当前点为u,当maxd[u]等于儿子结点v的时候,说明v原创 2013-04-28 11:40:02 · 415 阅读 · 0 评论 -
HDU 1561 The more, The Better(树形DP)
dp[i][j]表示为在i结点上选择j个节点的最大值转移方程:dp[u][j+k]=max(dp[u][j+k],dp[u][j]+dp[v][k]);//在i的结点上选择j+k的的值为 max(在i结点上选择j+k个结点的值,在i结点上选j个结点+在i的儿子结点v上选择k个结点的值)#include #include #include using namespace std;原创 2013-04-28 13:52:16 · 405 阅读 · 0 评论 -
UVA 1197 - The Suspects
简单dfs#include #include #include #include using namespace std;#define MAX 550bool vis[35000];vectorgps[MAX],ps[35000];//gps[i]表示组内成员,ps[i]表示这个人所有的所归属的组int pn,gn;void clear(){ for (int i原创 2013-03-28 10:20:58 · 606 阅读 · 0 评论 -
ZOJ 1909 Square(DFS+剪枝)
开始对边排一下序,搜索的时候完整的拼成了一条边的话从0开始搜索下一条完整的边.否则因为前面的木棍要么已经被选择了,要么是长度比当前完整边剩下的要长,根本没有必要再从0开始所以可以从当前的小木棍的下一个条小木棍开始搜索完成当前这条边,.不加这个剪枝怎么都过不了,20太大了.#include #include #include #include #include原创 2013-04-14 17:55:47 · 499 阅读 · 0 评论 -
ZOJ 1937 Addition Chains(DFS)
#include #include #include using namespace std;vectorstak,ans;int n;void dfs(){ if(stak[stak.size()-1]==n){ if(stak.size()<ans.size()){ ans=stak; } return; }else if(stak.size()>=ans.s原创 2013-04-14 19:55:58 · 828 阅读 · 0 评论 -
ZOJ 2081 Mission Impossible(BFS+DFS)
首先BFS找最短距离然后DFS搜索每一条最短路径,统计成功和失败的路径数目#include #include #include #include #include using namespace std;const int maxn=15;char maze[maxn][maxn];int di[]={-1,1,0,0},dj[]={0,0,-1,1},n,m,minDis原创 2013-04-14 10:04:52 · 608 阅读 · 0 评论 -
ZOJ 1694 Shredding Company(简单DFS)
#include #include #include #include #include using namespace std;vectorv,stak;vector >ans;int tar,start,minv,ansSum;void dfs(int curi,int sum){ if(sum<=tar&&curi==v.size()){ if(tar-sum<mi原创 2013-04-14 10:59:37 · 1596 阅读 · 0 评论 -
ZOJ 2192 T-Shirt Gumbo(DFS)
普通的搜索会超时可以剪的地方:1.库存里没有T-shirt了可以剪掉2.刚开始对各个参赛者的大小要求范围按最小的排个序,再进行搜索#include #include #include #include #include using namespace std;const int maxn=50;char buf[maxn],tb[90];string dem[30]原创 2013-04-14 15:38:43 · 451 阅读 · 0 评论 -
ZOJ 2922 Bombs(记忆化搜索)
从右下角左上扫描就可以了,其实不加记忆化搜索也是可以过的,记忆化搜索还不怎么会.dp1表示左边的下一个位置,dp2表示上面的位置下一个位置#include #include #include using namespace std;const int maxn=1010;int rm[maxn][maxn],dp1[maxn][maxn],dp2[maxn][maxn],n,原创 2013-04-23 17:49:44 · 639 阅读 · 0 评论 -
ZOJ 1107 FatMouse and Cheese(记忆化搜索)
用dp[i][j]数组存已经计算好的从i,j出发能得到的最大值,每次再求的时候可以直接返回去,避免重复计算.#include #include #include #include using namespace std;const int maxn=102;int dp[maxn][maxn],v[maxn][maxn],di[]={-1,1,0,0},dj[]={0,0原创 2013-04-23 20:41:17 · 478 阅读 · 0 评论 -
ZOJ 2292 Anti-bug before Chinese Valentine's Day(DFS+剪枝)
剪枝:1.当前用的杀虫剂的个数超过了当前最优值,剪掉2.当前的点上有虫子,必须要放杀虫剂,因为杀虫剂的范围是lawn[i][j],law[i][j+1],law[i+1][j],law[i+1][j+1],如果不放的话,后面就没有机会杀掉这个位置上的虫子了,想想就明白了3.如果当前位置放了杀虫剂,那么可以直接跳到ci,cj+2位置,因为杀虫剂的范围内已经没有虫子了,没有必要.4.如原创 2013-04-23 16:01:38 · 580 阅读 · 0 评论 -
ZOJ 1179 Finding Rectangles(DFS+剪枝)
首先开始对各个点的x坐标从小到大排序,然后每次搜索的时候只从下一个点开始对于每个点必须和栈中的某个点x坐标或者y坐标相等,不然没有必要搜.最后对结果排个序#include #include #include #include #include #include #include using namespace std;const int maxn=30;struct原创 2013-04-15 08:22:44 · 497 阅读 · 0 评论 -
ZOJ 2100 Seeding(简单DFS)
#include #include #include using namespace std;const int maxn=8;bool vis[maxn][maxn];char grid[maxn][maxn];int di[]={-1,1,0,0},dj[]={0,0,-1,1},n,m;bool dfs(int ci,int cj,int left){ if(left==0原创 2013-04-25 07:23:09 · 455 阅读 · 0 评论 -
ZOJ 1227 Free Candies(记忆化搜索)
#include #include #include #include using namespace std;const int maxn=21;int cnt[maxn],grid[maxn*2][4],mxans,n,idx[4],ans;;bool dp[42][42][42][42];void dfs(int tms){ mxans=max(mxans,ans);原创 2013-04-25 06:41:39 · 646 阅读 · 0 评论 -
UVA Cutting Sticks(记忆化搜索)
方程f[i,j]=0 if i+1==j,min(f[i,k]+f[k,j]+len[j]-len[i]) if 0#include #include #include using namespace std;int dp[60][60],len[60],n,L;int dfs_mem(int i,int j){ if(i+1==j)return 0; if(dp[i][j]!=原创 2013-04-25 10:32:25 · 447 阅读 · 0 评论 -
ZOJ 3631 Watashi's BG(DFS)
普通的0/1背包超时.只能用搜索.剪枝:首先对价格从大到小排序当前的和加上剩余的价格和如果小于等最优值,那么就剪掉,因为结果肯定小于等于最优值#include #include #include #include #include using namespace std;const int maxn=10000010;int pri[32],tot,ans,m,n原创 2013-04-25 23:25:30 · 479 阅读 · 0 评论 -
ZOJ 3620 Escape Time II(floyd+dfs)
因为每个点都可以访问多次,首先对各个点之间做一次floyd最短路,同一个连通分量的点可以互相走多次,然后进行搜索,搜索时候已经没有珠宝的房间就不要去了,最后当珠宝全部拿到手了,就去出口房间#include #include #include using namespace std;const int maxn=11;#define mmin(a,b) ((a)<(b)?(a):(原创 2013-04-27 08:13:02 · 512 阅读 · 0 评论 -
ZOJ 2862 Polymorphism(DFS)
因为是一棵树,所以可以首先dfs预处理把各个点的最近的实现了方法的祖先找出来(可以是自己).然后就O(1)的时间查询.#include #include #include #include #include #include using namespace std;const int maxn=30010;char buf1[300],buf2[300];int原创 2013-04-19 18:53:31 · 599 阅读 · 0 评论 -
ZOJ 1134 Strategic Game(树形DP)
dp[i][0]表示i结点放士兵的最优值,dp[i][1]表示i结点不放士兵的最优值因为是一棵树,所以状态转移方程:1.dp[i][0]+=min(dp[v][0],dp[v][1])表示i结点放士兵的最优值累加上v结点放士兵的最优值和v结点不放士兵的最优值.2.dp[i][1]+=dp[v][0] 很自然的就是i结点不放士兵的最优值累加上v结点放士兵的最优值,因为要覆盖每一条边,所以原创 2013-04-28 21:54:18 · 641 阅读 · 0 评论