- 浏览: 533044 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
参考这篇文章,以下前部分为转载:http://www.cppblog.com/Yuan/archive/2011/02/23/140553.aspx
大牛,谢谢!不是你,我还在用交替节点搜索呢:{ ——应该用交替层次搜索
如果目标也已知的话,用双向BFS能很大提高速度。
单向时,是 b^len的扩展。双向的话,2*b^(len/2) 快了很多,特别是分支因子b较大时
至于实现上,网上有些做法是用两个队列,交替节点搜索
×
,如下面的伪代码:
while(!empty()){
扩展正向一个节点
遇到反向已经扩展的return
扩展反向一个节点
遇到正向已经扩展的return
}
但这种做法是有问题的,如下面的图:
求S-T的最短路,交替节点搜索(一次正向节点,一次反向节点)时
while(1):
S –> 1
T –> 3
while(2):
S -> 5
T -> 4
while(3):
1 -> 5
3 -> 5 返回最短路为4,错误的,事实是3,S-2-4-T
我想,正确做法的是交替逐层搜索
,保证了不会先遇到非最优解就跳出,而是检查完该层所有节点,得到最优值。
也即如果该层搜索遇到了对方已经访问过的,那么已经搜索过的层数就是答案了,可以跳出了,以后不会更优的了。
当某一边队列空时就无解了。
优化:提供速度的关键在于使状态扩展得少一些,所以优先选择队列长度较少的去扩展,保持两边队列长度平衡。这比较适合于两边的扩展情况不同时,一边扩展得快,一边扩展得慢。如果两边扩展情况一样时,加了后效果不大,不过加了也没事。
无向图时,两边扩展情况类似。有向图时,注意反向的扩展是反过来的 x->y(如NOIP2002G2字串变换)
例题:
POJ1915
#include <stdio.h> #include <stdlib.h> #include <queue> #include <iostream> using namespace std; int l; //4<=l<=300 int sx,sy,tx,ty; int a[305][305]; //正向搜索层次 int b[305][305]; //反向搜索层次 struct point{ int x,y; }; struct point dir[]= { {1,2},{1,-2},{-1,2},{-1,-2}, {2,1},{2,-1},{-2,1},{-2,-1} }; bool check(int x,int y){ if(x>=0 && x<l && y>=0 && y<l) return true; else return false; } void dbfs(){ memset(a,-1,sizeof(a)); memset(b,-1,sizeof(b)); a[sx][sy]=0; b[tx][ty]=0; queue<point> forQ,backQ; point p1,p2; p1.x=sx; p1.y=sy; p2.x=tx; p2.y=ty; forQ.push(p1); backQ.push(p2); //正反向队列至少还有一个可以扩展 while(forQ.empty()==false || backQ.empty()==false){ //优化:优先扩展元素少的队列(如果只有一个队列非空,则扩展非空队列) int forSize=forQ.size(); int backSize=backQ.size(); if(backSize==0 || forSize<backSize){ //扩展正向队列一层 int i; for(i=0;i<forSize;i++){ point cur=forQ.front(); forQ.pop(); if(b[cur.x][cur.y]!=-1){ printf("%d\n",a[cur.x][cur.y]+b[cur.x][cur.y]); return; } int j; for(j=0;j<8;j++){ if(check(cur.x+dir[j].x, cur.y+dir[j].y)){ point next={cur.x+dir[j].x, cur.y+dir[j].y}; //!注意struct的创建方式 if(a[next.x][next.y]!=-1)//以前已经正向扩展过 continue; a[next.x][next.y]=a[cur.x][cur.y]+1; forQ.push(next); } } } }else{ //扩展反向队列一层 int i; for(i=0;i<backSize;i++){ point cur=backQ.front(); backQ.pop(); if(a[cur.x][cur.y]!=-1){ printf("%d\n",a[cur.x][cur.y]+b[cur.x][cur.y]); return; } int j; for(j=0;j<8;j++){ if(check(cur.x+dir[j].x, cur.y+dir[j].y)){ point next={cur.x+dir[j].x, cur.y+dir[j].y}; if(b[next.x][next.y]!=-1) continue; b[next.x][next.y]=b[cur.x][cur.y]+1; backQ.push(next); } } } } }//end while printf("0"); } int main(void){ int time; scanf("%d",&time); while(time-->0){ scanf("%d%d%d%d%d\n",&l,&sx,&sy,&tx,&ty); dbfs(); } return 0; }
poj 1077 :Eight
发表评论
-
快排备忘
2013-10-26 11:27 546http://hi.baidu.com/pluto455988 ... -
LRU简单实现C++
2013-10-17 10:52 3970页面置换算法: 在地址映射过程中,若在页面中发现所要访问的页 ... -
二叉树相关
2013-10-04 17:40 690本节主要是为了写二叉树类型题目练手的代码,重点培养运用“指针 ... -
双指针策略(《编程之美》3.5 最短摘要生成)
2013-03-26 15:17 2221本文源自《编程之美》3.5 最短摘要生成一课。 ... -
K-MEDOIDS聚类算法
2012-12-04 21:18 1935k-medoids聚类算法 (wiki上讲得很清楚啊:) ) ... -
搜索(三)——回溯
2012-11-23 15:23 1023一、回溯 和 深度搜索 ... -
哈希Hash
2012-11-21 14:42 974要点一:哈希表长度 的确定是个两难的问题:太短则容 ... -
状态压缩DP
2012-11-14 20:27 728引例、 例1、 例2、 例3、 ... -
模拟退火
2012-10-28 16:34 1199引用:http://www.cnblogs.com/heaad ... -
计算几何(一)——基础算法
2012-07-12 21:07 1902待续 《计算几何资料》为提纲 1. (1) 有向线段 ... -
计算几何(二)——平面最近点对
2012-07-12 10:54 885参考资料: 为何这个问题采用分治法 http://blog ... -
气泡滚大——剔除线性数据中的杂质
2012-06-18 09:43 940这是一道Java的面试题,但是我总结了除了一种自称为“ ... -
深入理解二分查找(二、二分答案)
2012-04-29 16:24 7179二分答案 如果已知候选答案的范围[min,max ... -
P问题、NP问题和NPC问题
2012-04-25 16:36 1046这篇文章转自这里 ... -
RMQ(Range Minimum/Maximum Query)区间最值查询
2012-04-18 20:47 1543一、RMQ问题描述 和 几种解题思路 RMQ问题 (Rang ... -
后缀数组
2012-04-16 09:49 1491一、后缀数组 及其对应的名次数组 举例:S=&quo ... -
大整数运算(部分转载)
2012-04-12 21:36 1170待补充:“浮点数高精度运算” 参见这里==> ... -
单向链表相关
2012-04-10 16:42 953单向链表是微软笔试常考的,参考这里:http://www.c ... -
关键路径(AOE)
2012-04-10 08:05 1648前面这段话是引用别人的,后面代码是自己写的,有待完善: ... -
搜索(一)——剪枝
2012-03-24 11:46 1533参考文档:《搜索方法 ...
相关推荐
16.8.3 方法graph::bfs的复杂性分析 16.8.4 深度优先搜索 16.8.5 深度优先搜索的实现 16.8.6 方法graph::dfs的复杂性分析 16.9 应用 16.9.1 寻找一条路径 16.9.2 连通图及其构成 16.9.3 生成树 第三部分 算法...
本书是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专著。 本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之...
本书是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专著。 本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之...
3.4.7 双向链表 95 3.4.8 小结 96 3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子...
本书是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专著。 本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之...
3.4.7 双向链表 95 3.4.8 小结 96 3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子...
3.4.7 双向链表 95 3.4.8 小结 96 3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子...
3.4.7 双向链表 95 3.4.8 小结 96 3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子...
3.4.7 双向链表 95 3.4.8 小结 96 3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子...
3.4.7 双向链表 95 3.4.8 小结 96 3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子...
7.5 应用——文本压缩 238 7.5.1 LZW压缩 239 7.5.2 LZW压缩的实现 239 7.5.3 LZW解压缩 243 7.5.4 LZW解压缩的实现 243 7.6 参考及推荐读物 247 第8章 二叉树和其他树 248 8.1 树 248 8.2 二叉树 251 8.3 二叉树的...
7.5 应用——文本压缩 238 7.5.1 LZW压缩 239 7.5.2 LZW压缩的实现 239 7.5.3 LZW解压缩 243 7.5.4 LZW解压缩的实现 243 7.6 参考及推荐读物 247 第8章 二叉树和其他树 248 8.1 树 248 8.2 二叉树 251 8.3 ...
搜索树 319 11.1 二叉搜索树 320 11.1.1 基本概念 320 11.1.2 抽象数据类型BSTree和 IndexedBSTree 321 11.1.3 类BSTree 322 11.1.4 搜索 322 11.1.5 插入 323 11.1.6 删除 324 11.1.7 ...
1.6.5 计算式查找法——哈希法…………………………………………………28 1.7 排序的基本概念……………………………………………………………………33 1.7.1 插入类排序………………………………………………...