树和图的深度优先搜索的模板框架

…衆ロ難τιáo~ 提交于 2019-12-01 21:18:48
#include<iostream>

using namespace std;

int N = 1e5 + 10,M = N*2;

//h表示链表头,e存储的是所有的边,ne表示所有的next指针是多少,相当与n个单链表
int h[N],e[M],ne[M],idx;

//深度优先搜索和宽度优先搜索每个点只会遍历一次
bool st[N];//存一下那些点已经被遍历过了,就不要再遍历他了

void add(int a,int b){//a前插入b
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
}

//树和图的深度优先搜索的代码 时间复杂度是O(n + m),因为点数和边数呈线性关系
//u表示已经遍历到这个节点了
int dfs(int u){
    st[u] = true;//首先先标记下当前这个点已经被搜索过了
    
    //遍历下u的所有的初边
    for(int i = h[u];i != -1;i = ne[i]){
        // 存储当前结点对应图里边结点的编号是多少
        int j = e[i];
        //如果当前点没有做过的话,就一直搜,一条路走到黑
        if(!st[j]) dfs(j);
        
    }
}

int main(){
    //头结点指向-1,n给单链表的头结点指向-1
    memset(h,-1,sizeof h);
    
    dfs(1);//从第一个点开始搜索
}

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!