穷举搜索

对于一些困难的问题,我们只能穷举(brut force)搜索,是的,我们知道“穷举搜索”这个词,可是,具体怎么穷举呢?

很多问题可以归结到图的搜索,对于图的搜索,大家应该都知道 DFS 和 BFS,然而可能没有多少人知道如何对图做穷举搜索。我先举一个最简单的例子:哈米尔顿环(hamilton cycle),不知道的,可以去维基百科上去查。

为了突出递归的逻辑,这个程序把所有(每次递归都相同的)函数参数换成了全局变量,从软件工程角度讲这是有问题的,但是作为示例,逻辑上更清楚一些。

这个程序从 stdin 读取一个图,这个图共 N 个结点,结点编号是 0~N-1。每行是一条边 src dest,中间用空白分隔。

从代码效率上讲,这个程序也也不够高效,一个在数据结构上(how to optimize vector<vector<int> > G ?)和程序逻辑(非递归) 上充分优化的版本,大约比这个要快10倍。

这个程序也接受一个参数 start ,表示搜索的起始结点,start  的默认值是 0。

下面是一个图的示例(g1.txt):


0 1
1 2
3 5
2 4
5 1
0 2
2 3
3 4
5 0
4 5

运行 hamilton 3 < g1.txt

输出结果是:found hamilton cycle: 3 4 5 0 1 2

穷举的一般代码框架是:

作者:
该日志由 csdn-whinah 于2011年07月17日发表在算法分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
转载请注明: 穷举搜索
标签:
【上一篇】
【下一篇】

您可能感兴趣的文章:

2 个回复

  1. Zhong_T说道:

    这个就是dfs吧。
    标准的dfs节点会做3个标记:
    1、未访问的,白色;
    2、已访问,未回溯的,灰色;
    3、已回溯的,黑色。
    lz所说的区别就相当于区分了黑色和白色而已。

  2. whinah说道:

    标记不一定非得照搬教科书, 我这个 hamilton 环搜索中, 如果 D 数组中 D[i] != -1, 就是灰色. 某个结点 finish 之后又马上设置成-1(相当于白色). 在我这个例子中实际上是没有黑色的!

发表评论

您必须 登录 后才能发表评论。