搜索
outer_form
OI/ACM
展开
-
【图论】【A*搜索】[POJ2449]Remmarguts' Date
题目 本题实质是求第k短的路径; SPFA+A* 进行启发式搜索直至访问终点k次, 估值函数:当前已经走的距离+当前点到终点的最短路 注意:当s==t时,要特判#include<cstdio> #include<queue> #include<cstring> #include<cstdlib> using namespace std; #define MAXN 1000 #define原创 2015-08-26 20:17:18 · 362 阅读 · 0 评论 -
[NOI2001]方程的解数
题目 DFS(meet in the middle) 通过此条件剪枝,由于本题数据较大,可通过HASH表存储方案数。#include<cstdio> #include<vector> #include<cmath> #include<cstdlib> using namespace std; #define MAXN 6 #define MAXH 4999999 struct node{原创 2015-08-26 20:06:54 · 714 阅读 · 0 评论 -
【图论】【最小生成树】[IOI2003]maintain
题目描述:点击此处 解题思路: 在加边的同时对边进行插入排序,当边的数量≥n-1时,进行kruskal,此时每次kruscal的复杂度为O(m),算法的时间复杂度为O(m^2)实现代码#include<cstdio> #include<cstring> #define INF 0x7f7f7f7f #define MAXN 200 #define MAXM 6000 #include<algor原创 2015-08-26 20:08:11 · 840 阅读 · 0 评论 -
【搜索】[POJ3897]Maze Stretching
题目 分析:显然是搜索,bfs比较慢,那就用A*吧,但是并不能直接用A*求最短路,因为在你讲迷宫拉伸了之后,你一开始找的最短路并不一定最短(我是这么觉得,自己想想),所以就二分拉伸的比例,然后用A*进行Check。代码#include<cstdio> #include<queue> #include<cstdlib> #include<cstring> using namespace std; #原创 2015-08-26 20:13:45 · 455 阅读 · 0 评论 -
搜索技巧
1.最优性、可行性剪枝 2.估计搜索空间大小 3.选择合适搜索对象 4.选择搜索方向 5.控制搜索深度I.D,DFS,IDA* 6启发式(估值函数) 7.双向搜索:DFS:中间相遇(meet in the middle) BFS:双向BFS原创 2015-08-26 20:18:29 · 366 阅读 · 0 评论 -
【搜索】[HDU1175]连连看
题目 分析:这道题看到的第一反应应该就是BFS或者DFS,裸的DFS、BFS显然会TLE,所以我就想用A*,不过好像并不好写启发函数。 枚举步数不行,就枚举边吧。因为允许有两次转折,所以最多有三条边枚举中间的一条边,然后进行check,这道题只用了两个for循环就AC了。代码:#include<cstdio> #include<queue> #include<algorithm>原创 2015-08-26 20:13:16 · 507 阅读 · 0 评论 -
【搜索】[NOIP2012]mayan游戏
题目自己上网找。 分析,由于只有五层,而且每一层的选择很多,所以总的状态十分多,果断dfs。 暴搜过70%数据。#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; int n,a[6][6][9],ans[6][3],dir[2]={-1,1}; bool f[原创 2015-10-21 13:43:53 · 646 阅读 · 0 评论 -
【A*/Meet in the middle/BFS模板】8数码问题
A*#include<cstdio> #include<cstring> #include<queue> #include<cstdlib> #include<stack> using namespace std; stack<char>s; struct node{ int dist,h,c; unsigned short s[10]; bool operator<(con原创 2016-01-30 09:56:33 · 437 阅读 · 0 评论 -
【搜索】[NOIP2004]虫食算
题目 从各位开始按照字母出现的顺序枚举每个字母代表的值; 剪枝:1.搜索时每个数值只能由一个字母代表 2.搜索中如果发现有矛盾就回溯#include<cstdio> #define MAXN 26 #include<cstdlib> #include<cstring> int a[MAXN+10],n,e[MAXN+10]; char x[MAXN+10],y[MAXN+10]原创 2015-08-26 20:10:23 · 1422 阅读 · 0 评论