1. DFS生成排列
众所周知,1,2…n的排列一共有n!个,因此生成全排列至少需要n!的时间复杂度。如果用循环来生成排列,当n稍大时,内外循环会非常之多。可以用DFS模拟解决,生成0 … n-1的排列的代码如下:
void dfs(int depth)
{
int i;
if(depth==n) //n个数排列完毕
{
print the result
return;
}
for(i=0;i<n;i++)
if(!visit[i]) //点i没被访问
{
visit[i]=1;
result[depth]=i;
dfs(depth+1); //进入下一次递归
visit[i]=0; //回溯,将点i重新标记为未被访问
}
}
有一些排列问题带有限制条件,比如数a必须排在数b的前面,或者数c必须排在数d的后面。这样排列问题变成了拓扑排序
这篇博客介绍了如何使用深度优先搜索(DFS)生成排列,特别是面对有限制条件的排列问题。通过DFS实现拓扑排序,解决了包括POJ 2907、1256、1270和2367在内的题目,涉及寻找最短路径、全排列以及处理有向无环图的限制关系。在处理重复元素和避免输出重复排列时,需要进行适当的剪枝策略。
订阅专栏 解锁全文
4958

被折叠的 条评论
为什么被折叠?



