dfs有别于BFS:一条路走到底,所以对于大数据的题目,剪枝对dfs来说十分关键。
写dfs的步骤:
1、思考参数们代表的状态
2、思考递归出口
3、思考如何剪枝
4、思考如何进入下一状态
模板:
const int MAXN=100 bool vis[MAXN],compress[10<<1];//compress,状态压缩 int wan[MAXN][MAXN]; void dfs(/*参数们*/) { if(/*递归出口条件*/) { //do sth return; } for(int i=1;i<=N;++i) //递归入口 { if(!vis[i]) //递归入口条件 {
if(!compress[])
{ vis[i]=1;
compress[]=1; dfs(); vis[i]=0; //回溯
}
} } }