穷举搜索

对于一些困难的问题,我们只能穷举(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

穷举的一般代码框架是:


你可能感兴趣的:(搜索)