DFS和BFS

217 阅读1分钟

一般用递归实现DFS算法................

void DFS(type n){                       //可以描述阶段的状态
	if(符合条件) {cout<<答案;return;}	//出口
	if(可以剪枝) return;                //剪枝
	for(i:1~p){                         //选择该阶段的所有决策
		选择可行决策;                   //剪枝的一种 
		标记已访问该点;
		DFS(n+1);                       //进入下一阶段
		(还原访问现场;)
	}
}

BFS算法一般用队列实现

void BFS(int s){
    queue<int> q;
    q.push(s);
    while(!q.empty()){
        取出队首元素top;
        访问队首元素top;
        将队首元素出队;
        将top的下一层结点中未曾入队的结点全部入队,并设置为已入队;
    }
}

DFS遍历图

DFS(u){  //访问顶点u
    vis[u]=true;
    for(从u出发可以到达的所有顶点v){
        if(vis[v]==false){
            DFS(v);
        }
    }
}

DFSTrave(){  //遍历图G
    for(图G的所有顶点u){
        if(vis[u]==false){
            DFS(u);  //访问u所在的连通块
        }
    }
}

BFS遍历图

BFS(u){
    queue q;
    将u入队;
    vis[u]=true;
    while(q非空){
        取出q的队首元素访问;
        for(从u出发可达的所有顶点v){
            if(vis[v]==false){
                将v入队;
                vis[v]=true;
            }
        }
    }
}

BFSTrave(G){
    for(G的所有顶点u){
        if(vis[u]==false){
            BFS(u);
        }
    }
}