深度优先搜索也就是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
",dis[x]^dis[y]);
}
return 0;
}