zoukankan      html  css  js  c++  java
  • 深度优先搜索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
    ",dis[x]^dis[y]);
    	    }
    	    return 0;
    }
  • 相关阅读:
    记录JavaScript的util.js类库
    Shiro登录中遇到了问题
    【转载】JavaScript导出Excel
    react-router
    react 表单
    html5定位getLocation()
    html5存储方式localstorage和sessionStorage
    position导致Safari工具栏不自动隐藏
    input type="datetime-local" 时placeholder不显示
    vuex(1.0版本写法)
  • 原文地址:https://www.cnblogs.com/ezoihy/p/9030027.html
Copyright © 2011-2022 走看看