扩大
缩小

深度优先搜索DFS

深度优先搜索也就是DFS,使我们oi竞赛中使用的最多的算法之一

我们今天就来看下这个神奇的算法

1.什么是DFS

事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次

2.DFS有什么用

其实这个DFS往往用来遍历一幅图,在树剖、网络流等算法中会用到。它还可以用来求dfn序。以下代码就是求dfn序最普遍的写法。

void dfs(int now){
	dfn[now]=tim++;
	//do something
	for(int i=0;i<edge[now].size();i++)
		if(!vis[edge[now][i]])
			dfs(edge[now][i]);
}

这里写图片描述

3.关于DFS的一些例题

我们可以看下以下几道题


全排列问题


让我们异或吧


这两道题都是比较裸的dfs


我先贴以下全排列的代码
这是比较简洁的代码

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int n,b[15];
bool vis[15];

void dfs(int x){	
	if(x>n){
		for(int i=1;i<=n;i++)printf("%5d",b[i]);
		puts("");
		return;
	}else{
		for(int i=1;i<=n;i++){
			if(!vis[i]){
				b[x]=i;
				vis[i]=1;
				dfs(x+1);
				vis[i]=0;
			}
		}
	}
}

int main(){
	scanf("%d",&n);
	dfs(1);
	return 0;
}

这是另外的代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100005

using namespace std;
	
int n,m,cnt,head[N],dis[N];

bool vis[N];

struct Edge{
    int to,nxt,cost;
}edge[N<<1];	

void addedge(int u,int v,int w){
    edge[++cnt].to=v;
    edge[cnt].nxt=head[u];
    edge[cnt].cost=w;
    head[u]=cnt;
}

void dfs(int o,int val){
    dis[o]=val;
    vis[o]=1;
    for(int i=head[o];i;i=edge[i].nxt){
        if(!vis[edge[i].to]){
            dfs(edge[i].to,val^edge[i].cost);
        }
    }
}

int main(){
	    scanf("%d",&n);
	    for(int i=1;i<n;i++){
	        int x,y,z;
	        scanf("%d%d%d",&x,&y,&z);
	        addedge(x,y,z);
	        addedge(y,x,z);
	    }
	    dfs(1,0);
	    scanf("%d",&m);
	    for(int i=1;i<=m;i++){
	        int x,y;
	        scanf("%d%d",&x,&y);
	        printf("%d\n",dis[x]^dis[y]);
	    }
	    return 0;
}
posted @ 2018-05-12 21:39  ezoiHY  阅读(229)  评论(0编辑  收藏  举报