随笔分类 -  图论——搜索题目

摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4739题意:给定100*100的矩阵中n(n#include #include #include #include #include #include #include #include #include #include #include #include #include #define CL(arr, val) memset(arr, val, sizeof(arr))#define lc l,m,rt> 1#define Min(x, y) (x) pt[M][M];//记录每个位置点的个... 阅读全文
posted @ 2013-09-19 17:29 E_star 阅读(244) 评论(0) 推荐(0) 编辑
摘要:bfs+位压缩:hdu 1429http://acm.hdu.edu.cn/showproblem.php?pid=1429中文题目:思路:bfs+位压缩#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define CL(arr, val) memset(arr, val, sizeof(arr))#define lc l,m,rt> 1#define Min(x, y) (x) a. 阅读全文
posted @ 2013-05-30 13:49 E_star 阅读(279) 评论(0) 推荐(0) 编辑
摘要:题意:给你一个矩阵,row , colum <= 15 ,矩阵里面的字符要么是"."表示空,要么是”X“,表示存在东西, 要求最少的移动次数使得矩阵里面全部为空. 移动规则,一次最多移出R行或者C列。求最少的移动次数。思路:当时比赛的时候,自己想了一个贪心的算法,枚举行,枚举列找出满足连续R或者C的能够移出的X的个数最多一个进行移动,样例都过了也懒得再思考,最后结果被系统给打败了。看了看人家的代码,感觉瞬间挫败感,这么短的时间内,思路这样清晰,写的代码还这么漂亮,哎...差距啊。我们选定行,或者列,这里选取的行枚举所有可能。2^15次方,然后处理掉要移出的列里面所有的 阅读全文
posted @ 2013-03-03 19:31 E_star 阅读(278) 评论(0) 推荐(0) 编辑
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2495题意:给定一个3*3的矩阵,矩阵里面的数字的取值为3,6,9,12 。我们有9中操作,可以使举证中一些数字+3 ,问通过这九种操作我们能够用最少的操作数的序列,使得矩阵中的数字全部变成12.如果存在相同的则取字典序最小的。思路:才开始脑子转不过来,不知道怎么搜。。最后想了想,数字是以3的倍数增加的,每操作3次对应的数字又会回到原来的状态。所以我们只要枚举每种操作的次数。每种操作可以取0,1,2,3次这样的时间复杂度就是O(4^9)次方了。 阅读全文
posted @ 2012-12-03 18:21 E_star 阅读(253) 评论(0) 推荐(0) 编辑
摘要:http://codeforces.com/contest/244题意:给一个数n(1 ≤ n ≤ 109),然后求小于等于n的数,该数并且满足只有两个十进制数(0-9)组成的个数;思路:当时就是一门心思推公式,结果还是没找出规律。赛后想了想推个毛公式啊直接暴力枚举n的长度,然后枚举0到9两辆组合时间复杂度为O(10*10*10*2^10) = O(10^6)啊。哎只怪自己没有想出来吧。这里还要注意当枚举长度为10时可能会出现超数据类型的要用__int64#include <iostream>#include <cstdio>#include <cstdlib&g 阅读全文
posted @ 2012-11-19 20:07 E_star 阅读(243) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4274题意:我们派出的间谍得到一些信息,信息包括N个职工分别负责N个部门,每个职工最多有一个上司,每个职工的工资最少为1,上司i负责部门i 而i的下属也属于部门i,给出m个部门的描述,i < W 表示部门i的所有人的总工资小于w,(包括i以及i的下属,下边一样);i > W 表示部门i的所有人的总工资大于W;i = W 表示部门i所有人的总工资等于W让你判断这些信息是否正确,如果寻在矛盾说明不正确。思路:比赛时,最后20分钟才有思路,不过没写完,。。郁闷。。每个点low[i]记录i部门最少可得的工 阅读全文
posted @ 2012-09-14 20:11 E_star 阅读(200) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4277题意:给出n条线段,每条线段的长度为li(1 <= li <= 10000)1 <= N <= 15。才开始想到了爆搜算了一下时间复杂度O(3^15)*15勉强可以,可是在判重问题上一直很纠结,不知道该怎么处理,素以就放下了。赛后看了看解题报告,可谓经典啊。。爆搜所有的组合,然后set(或者hash判重),这里由于li<=10000 N <=15 所以最大的长度肯定小于10000000000000000ll,在__int64的表示范围之内,所以我们只需要将a,b, c 阅读全文
posted @ 2012-09-12 19:56 E_star 阅读(229) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1691题意:给定一个大矩形,然后给出n个需要染色的小矩形的左上角的坐标,右下角的坐标以及该矩形要染得颜色,每个颜色对应的一把刷子。问将这些小矩形染完规定的颜色之后需要最少的刷子数。要求:只当该小矩形的上边的矩形都染完色之后,该矩形才能染色,如果同一个刷子被使用多次也要计算进来;思路:首先根据一个矩形的所有上部分染完之后才能染色建立关系图,然后根据拓扑排序的理论,找入度为0的点开始染色,(因为入度为0 表明其上部的所有矩形都已经染色),dfs所有点求最小值。注意这里画的边只是统计度数用的,而我们真正用来描述可行的边是根据经过该点之后的剩余点里 阅读全文
posted @ 2012-08-11 17:36 E_star 阅读(368) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3373题目意思:给出2个整数N(n<10^100)和K(k<10000),求满足以下条件的整数M1、M与N位数相同2、M能被K整除3、满足以上两点时,M和N不同位数最少4、满足以上三点时,M值最小思路:题目意思很好理解,我们只要以n为基础分两个方向搜索即可,1:首先搜索比n小的,这样保证在为数不同的前提下,M值最小;2:搜索比n大的,详细的解题报告:http://blog.csdn.net/lyy289065406/article/details/6698787解题报告中说只要改变n的5位就一定能够找到解(由鸽巢定理得 k最多为 阅读全文
posted @ 2012-08-11 15:15 E_star 阅读(273) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1724题意:Bob现在有的钱数为k,他想从城市1到城市n,给出m条连接两个城市的有向边,并且给出路的长度w,和经过这条路要交的钱数c。问Bob在花的过路费不超过k的前提下能到达城市n的最短路径为多长。思路:才开始我想spfa来做,开两个数组dis记录距离最短disw记录话费最小,在松弛的时候进行距离与费用的限制来进行,可是发现当某一个点被多个点更新时,比如i点被更新为[7,12] [9,9] [12,7]那我们选择哪一个呢?如果我们选择路径短的话,[7,12] 可是可能时间总和就会超出k,如果我们选择费用小的话[12,7] 可是路径的长度可 阅读全文
posted @ 2012-08-10 22:09 E_star 阅读(215) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3411题意:给出 n 个节点 m 条边,求从 1 到 n 的最小花费。有两种支付方式:1> 预先在城市 Ci (必须先到过该城市)支付费用 Pi ;2> 在终点 Bi支付费用 Ri;思路:这里给定的节点,边的数量都<=10爆搜没问题,关键注意一下几点:1> 边有多条,不能用邻接矩阵计算,而要用邻接表(存在重边)。2> Pi 始终小于等于对应的 Ri。3>每个点可以走多次,边也可以走多次。这里正常的搜索写法不会重复走一个点而这里当遇到需要提前支付的路并且支付点还没有访问过就必须返回去访问支付点,这里我们每次 阅读全文
posted @ 2012-08-10 20:18 E_star 阅读(217) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1699题意:现在给出几个基因片段,要求你将它们排列成一个最短的序列,序列中使用了所有的基因片段,而且不能翻转基因。,这些基因可以重叠,只要一个基因的后段和一个基因的前端一样,就可以将其重叠链接在一起。现问将这些 基因全部排列出来,最短的长度为多少。思路:给出的数据量比较小相信爆搜+剪枝是可以的。首先是要预处理一下每两个基因片段合并时能够增加的长度,便于以后dfs时,直接求和就可以。View Code #include<iostream>#include<cstdio>#include<cstring>#i 阅读全文
posted @ 2012-08-10 11:40 E_star 阅读(248) 评论(0) 推荐(0) 编辑
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4777本来想的算法是如果V<=100000就直接进行01背包时间复杂度为O(30*100000),如果大于100000大于部分贪心选择,剩余部分在进行01背包,可是中间会出现很多问题,大于部分的的处理不好弄,如果100000加上处理后的剩余部分会出现数组越界,再说有的数据也不会过,这只是一种yy的方法,不对。后来据说是爆搜解决01背包想了想时间复杂度能够达到(10^9自己不敢写,竟没有想到剪枝弄好了能够过,于是就写了起来,这里首先从大到小排序,这样大的在前边保证先装大的 阅读全文
posted @ 2012-07-30 10:50 E_star 阅读(248) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2531就是和原来的奶牛翻碗问题,翻黑白棋问题,开门问题属于一类题目,对于每一点只有两种状态,要么属于A要么属于DFS枚举出所有的状态即可。。才开始自己按自己的习惯写的DFS1469ms最后看了看别人的优化到了375ms。。。就是在处理求和时的优化了。。我的代码:View Code #include <iostream>#include <cstring>#include <cstdio>#define maxn 23using namespace std;bool vt[maxn];int n,ans;i 阅读全文
posted @ 2012-04-19 20:29 E_star 阅读(175) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3087刚看到题目的时候给我整蒙了,BFS怎么做啊?这不就是模拟一下洗牌的过程,如果遇到目标字符串就输出步数,如果回到原始串,就说明到不了目标串。View Code #include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;char aim[207];//目标串int n;struct node{ char s1[107]; char s2[107]; int len;};b 阅读全文
posted @ 2012-04-19 15:41 E_star 阅读(158) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3126题意给定两个四位素数s,e,求出经过最少的步数由s得到e,每一步的要求是每次只能改变四位数中一位数,并且改变后的数要求也要是素数。首先求出1000到9999所有的素数,然后有s到e进行bfs,知道遇到e结束。刚开始自己写完代码之后,测试了一下数据,吓死我了,很慢。心想怎么优化呢。想了很长时间,感觉应该能过啊,不耐烦了还是提交了一下。结果1Y。。。囧啊!!不知道威慑呢么机器上运行的很慢。。看了一下300多秒。View Code #include <iostream>#include <cstdio>#includ 阅读全文
posted @ 2012-04-18 21:43 E_star 阅读(305) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1426首先补充一下基础知识:一:常用数据类型对应字节数 可用如sizeof(char),sizeof(char*)等得出 32位编译器: char :1个字节 char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器) short int : 2个字节 int:4个字节 unsigned int : 4个字节 float:4个字节 double:8个字节 long:4个字节 long long:8个字节 unsigned long:4个字节 64位编译器: char :1个字节 c 阅读全文
posted @ 2012-04-17 21:14 E_star 阅读(169) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3278就是农场主在X轴上找牛,给定牛的坐标,扭不动,农场主可以 +1 -1 *2 的方式前进,求最少的步数使其找到牛。分三种情况走,直到遇到牛即可,同时为了避免不断的重复于某一点,记录到达该点的最短距离。View Code #include <iostream>#include <cstring>#include <cstdio>#include <queue>#define maxn 100007#define inf 9999999using namespace std;int ans,s 阅读全文
posted @ 2012-04-16 10:55 E_star 阅读(208) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2251很简单的求最短路径的BFS题目,才开始自己写了各DFS直接性TLE。。。三维的,就是多加了两个方向罢了,再处理的时候就按i,j,k来;View Code #include <iostream>#include <cstring>#include <cstdio>#include <queue>#define maxn 33using namespace std;struct node{ int x,y,z; int len;}s;char map[maxn][maxn][maxn];bo 阅读全文
posted @ 2012-04-13 20:30 E_star 阅读(209) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1321自己真是本了开始写了歌对于棋子有顺序的搜索,导致求出来是ans的阶乘种数了,因为k < n且不能在同一行同一列,只要按行搜索,记录列是否被访问过即可!View Code #include <iostream>#include <cstdio>#include <cstring>#define maxn 12using namespace std;char map[maxn][maxn];bool vt[maxn];int n,m,ans;void dfs(int x,int len){ int 阅读全文
posted @ 2012-04-13 10:42 E_star 阅读(217) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示