图的广搜与深搜模板

题目传送门

深搜

深搜,顾名思义就是往深了搜。每次,只要你发现下一个点可以走,你马上走上去 就行啦!!就这样不断递归,直到遇到你的边界条件,撞到了南墙,你再也走不下去了,哼哼,我回头退回去!!

可以跟大家看下样例::(自己去题面看图) 样例是从1出发,先走2,然后走5,发现走不下去,退回来。 站在2这里,我们又往6走,发现又走不下去了,退回2.此时2没有点可走,退回1,去往3。 在3点,我们前往7,然后再往8,无路可走,退回7-》3——》1.最后走4。

广搜和深搜略有不同。

广搜就是先站在目前这个点,将周围扫描一遍,如果可以走,我就矜持一点,不马上走你,而是将你存入队列里面。等到队列里前面的点都搜完了,才轮到它上。这里靠语言描述或许没有那么好,还是看代码比较舒服。

完整板子代码(注意排序函数,十分有用):

#include<bits/stdc++.h>
using namespace std;
#define N 900010
#define orz 0
//数组注意开大点,不然很容易WA或者RE

inline int read(){
    int x = 0,s = 1;
    char c = getchar();
    while(c < ‘0‘ || c > ‘9‘){
        if(c == ‘-‘)s = -1;
        c = getchar();
    }
    while(c >= ‘0‘ && c <= ‘9‘){
        x = (x << 1) + (x << 3) + (c ^ ‘0‘);
        c = getchar();
    }
    return x * s;
}

struct hhh{
    int x,y;
} b[N];
int n,m;
int f[N];
struct node{
    int u,v,next;
} t[N];

bool vis1[N];
void dfs(int now){
    for(int i = f[now];i;i = t[i].next){
        int v = t[i].v;
        if(!vis1[v]){
            printf("%d ",v);
            vis1[v] = 1;
            dfs(v);
        }
    }
}

queue <int> q;
bool vis2[N];//其实把上面那个vis1清空也可以,不过这样省清空时间。
void bfs(){//广搜模板直接打上去
    q.push(1);
    while(!q.empty()){
        int now = q.front();
        q.pop();
        printf("%d ",now);
        for(int i = f[now];i;i = t[i].next){
            int v = t[i].v;
            if(!vis2[v]){
                vis2[v] = 1;
                q.push(v);
                //和深搜不同,广搜发现可以用的点是存入队列,而不是直接跑过去
            }
        }
    }
}

bool cmp(hhh a,hhh b){//一个十分特殊但是很有用的排序cmp函数。
    return a.y > b.y || (a.y == b.y && a.x > b.x);//勤加思考,大家自行理解一下
}

int cnt1 = 0;//经典链表存图
void add(int u,int v){
    cnt1++;
    t[cnt1].u = u;
    t[cnt1].v = v;
    t[cnt1].next = f[u];
    f[u] = cnt1;
    return;
}

int main(){
    //freopen("hh.txt","r",stdin);
    n = read(),m = read();
    for(int i = 1;i <= m; i++){
        b[i].x = read(),b[i].y = read();
    }//先用另外一个结构体将每个点的信息排好序,再进行建图.
    sort(b + 1,b + m + 1,cmp);
    for(int i = 1;i <= m; i++)
        add(b[i].x,b[i].y);
    printf("1 ");
    vis1[1] = 1;
    dfs(1);
    printf("\n");
    vis2[1] = 1;
    bfs();
    return orz;
}

原文地址:https://www.cnblogs.com/wondering-world/p/12634479.html

时间: 2024-10-09 23:55:55

图的广搜与深搜模板的相关文章

图论---图的m-点着色判定问题(深搜--迭代式)

转自 图的m着色问题 图的m-着色判定问题--给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色? 图的m-着色优化问题--若一个图最少需要m种颜色才能使图中任意相邻的2个顶点着不同颜色,则称这个数m为该图的色数.求一个图的最小色数m的问题称为m-着色优化问题. 算法描述(迭代算法) color[n]存储n个顶点的着色方案,可以选择的颜色为1到m t=1->n 对当前第t个顶点开始着色:(DFS) if: t>

广搜和深搜

深度优先搜索: dfs,运用递归函数,通过栈的结构进行搜索. 模板: ·dfs(状态)  –if 状态 是 目标状态then ·dosomething –else ·for 每个新状态 –if 新状态合法 »dfs(新状态) ·主程序: ·dfs(初始状态) 广度优先搜索: bfs,运用递归函数,通过队列的方式搜索. dfs就是对于某一个搜索树,通过一定的顺序把每一个枝上的子树全都遍历一遍..也就类似于从起点出发,先把一个方向的点都遍历完才会改变方向......“不撞南墙不回头” bfs是遍历某

oj 1792:迷宫 广搜和深搜

描述 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行.同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到.如果起点或者终点有一个不能通行(为#),则看成无法办到.输入第1行是测试数据的组数k,后面跟着k组输入.每组测试数据的第1行是一个正整数n (1 <= n <= 1

深搜和广搜的原理及优缺点

原文来源:https://blog.csdn.net/dark_cy/article/details/88926435 深搜原理深搜,顾名思义,是深入其中.直取结果的一种搜索方法. 如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇到终点,他绝不后退一步!因此,他的姐姐广搜总是嘲笑他,说他是个一根筋.不撞南墙不回头的家伙. 深搜很讨厌他姐姐的嘲笑,但又不想跟自己的亲姐姐闹矛盾,于是他决定给姐姐讲述自己旅途中的经

算法-图是否为树(并查集或深搜)

今天做了一道很有意思的一道题,这道题虽然难度只是中等,但是里面涉及到的东西却是不少.其中,我在里面学习到了并查集这个东西,虽然不是很深刻,至少有一个印象:还有深搜,一直以来,深搜和广搜都是我的弱项,本文的理解是基于别人的博客:lintcode178. graph valid tree 图是否是树.我们来看看题 题意: 给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每 条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树 样例: 给出n = 5 并

深搜和广搜

先说说这个神秘的深搜: 前几天我心中的大牛给我讲了深搜感觉还是挺简单的,可大牛告诉我深搜深搜深的让你不知道怎么搜 我们也是从一道题来看:n的全排列 比如说3的全排列 123 213 321 这就是全排列   在没学过深搜的时候我们会用for循环来做这道题 但是如果n很大的时候就不行了 所以我们就一定要深搜了 其实在我看来深搜和递归是亲兄弟 深搜就是递归的加强版 我先写一个简单的dfs(深搜)函数的代码 #include<stdio.h> int dfs(int x) { if(x > n

nyoj 488 素数环(深搜)

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样

hdoj-1312-Red and Black(深搜)

Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 12377    Accepted Submission(s): 7698 Problem Description There is a rectangular room, covered with square tiles. Each tile is colo

算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 马上又要秋招了,赶紧复习下基础知识.这里复习下二叉树.图的深搜与广搜.从图的遍历说起,图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序访问"图"中所有的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现: 广度优先(优先走最近的),用的数据结构是队列,主要是迭代实现: 对于深搜,由于递归往往可以方便的利