搜索与图论(一)

这篇具有很好参考价值的文章主要介绍了搜索与图论(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、DFS与BFS

1.1深度优先搜索(DFS)

DFS不具有最短性

搜索与图论(一),基础算法,图论

//排列数字问题
#include<iostream>
using namespace std;

const int N = 10;
int n;
int path[N];
bool st[N];

void dfs(int u)
{
    if(u == n)
    {
        for(int i = 0;i < n;i++) printf("%d",path[i]);
        puts("");
        return;
    }
    for(int i =1;i <= n;i++)
    {
        if(!st[i])
        {
            path[u] = i;
            st[i] = true;
            dfs(u + 1);
            st[i] = false;
        }
    }
}
int main()
{
    cin>>n;
    dfs(0);
    return 0;
}

1.2宽度优先搜索(BFS)

一层一层搜索,可以搜到最短路。

搜索与图论(一),基础算法,图论

 搜索与图论(一),基础算法,图论

 文章来源地址https://www.toymoban.com/news/detail-615476.html

//走迷宫问题
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;

typedef pair<int,int> PII;

const int N = 110;

int n,m;
int g[N][N];
int d[N][N];
PII q[N * N];

int bfs()
{
    int hh = 0,tt = 0;
    q[0] = {0,0};

    //初始化为-1
    memset(d,-1,sizeof d);
    d[0][0] = 0;

    //定义头的向量
    int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};

    while(hh <= tt)
    {
        auto t = q[hh ++];

        for(int  i = 0; i< 4;i++)
        {
            int x = t.first + dx[i],y = t.second + dy[i];
            if(x >=0 && x < n && y >= 0 && y < m && g[x][y] ==0 && d[x][y] == -1)
            {
                d[x][y] = d[t.first][t.second] + 1;
                q[++ tt] = {x,y};
            }
        }
    }
    return d[n - 1][m - 1];
}

int main()
{
    cin>>n>>m;

    for(int  i = 0;i < n;i++)
        for(int j = 0;j < m;j++)
            cin>>g[i][j];

    cout<<bfs()<<endl;

    return 0;
}

二、树与图的遍历

2.1树与图的深度优先遍历

搜索与图论(一),基础算法,图论

#include<iostream>
using namespace std;

int n,m;
//h存的是n个链表的链表头
//e存的是所有的结点值
//ne存的是每个节点的next指针
int h[N],e[M],ne[M],idx;
bool st[N];

void dfs(int u)
{
    stu[u] = true; //标记一下,已经被搜过了
    
    for(int i = h[u];i != -1;i = ne[i])
    {
        int j = e[i];
        if(!st[j]) dfs(j);
    }
}

2.2树与图的广度优先遍历

搜索与图论(一),基础算法,图论

 

int n,m;
int h[N],e[N],ne[N],idx;
//d是距离,q是队列
int d[N],q[N];

//插入函数
void add(int a,int b)
{
    e[idx] = b,ne[idx],ne[idx] = h[a],h[a] = idx++;
}
int bfs()
{
    //定义队头队尾
    int hh = 0,tt = 0;
    q[0] = 1;
    
    memset(d,-1,sizeof d);
    
    d[1] = 0;
    
    while(hh <= tt)
    {
        int t = q[hh ++];
        for(int i = h[t];i != -1;i = ne[i])
        {
            int j = e[i];
            if(d[j] == -1)
            {
                d[j] = d[t] + 1;
                q[++ tt] = j;
            }
        }
    }
    return d[n];
}

三、拓扑排序

适用于有向图

搜索与图论(一),基础算法,图论

 

#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 100010;

int n,m;
int h[N],e[N],ne[N],idx;
//q为队列,d为存储的入度
int q[N],d[N];

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

bool topsort()
{
    int hh = 0,tt = -1;

    for(int i =1;i <= n;i++)
    {
        if(!d[i])
            q[++tt] = i;
    }
    while(hh <= tt)
    {
        int t = q[hh++];

        for(int i = h[t];i!=-1;i = ne[i])
        {
            int j = e[i];
            d[j]--;
            if(d[j] == 0) q[++tt] = j;
        }
    }
    return tt == n-1;
}
int main()
{
    cin>>n>>m;

    memset(h,-1,sizeof h);

    for(int  i = 0;i < m;i++)
    {
        int a,b;
        cin>>a>>b;
        add(a,b);
    }
    if(topsort())
    {
        for(int i =0;i < n;i++) printf("%d",q[i]);
        puts("");
    }
    else{
        puts("-1");
    }

    return 0;
}

到了这里,关于搜索与图论(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法基础:搜索与图论】3.2 树与图的dfs和bfs

    要学会建树、建图的通用方法。 dfs 和 bfs 的代码框架。 https://www.acwing.com/problem/content/848/ 在 dfs 的过程中,统计各个节点作为断点时的连通块最大值。 https://www.acwing.com/problem/content/849/ 看到最短距离就可以想到使用宽搜。 注意! :题目中说明了 a 和 b 表示存在一条从 a 走到

    2024年02月16日
    浏览(38)
  • acwing算法基础课(第三讲 搜索与图论)

    void dfs(int u){ if(n == u){ for(int i = 0;i n;i++) puts(g[i]); puts(“”); return; } for(int i = 0;i n;i++){ if(!col[i] !dg[u+i] !udg[n - u + i]){ g[u][i] = ‘Q’; col[i] = dg[u+i] = udg[n - u + i] = true; dfs(u+1); col[i] = dg[u+i] = udg[n - u + i] = false; g[u][i] = ‘.’; } } } int main(){ scanf(“%d”,n); for(int i = 0;i n;i++){ for(int j = 0;j

    2024年04月10日
    浏览(53)
  • 【AcWing算法基础课】第三章 搜索与图论

    本专栏文章为本人AcWing算法基础课的学习笔记,课程地址在这。如有侵权,立即删除。 特点 :尽可能先向 纵深方向 搜索。使用 stack 实现。所需空间 O(h) (h为深度)。不具有“最短性”。 题目链接 :842. 排列数字 1.1题目描述 给定一个整数 n,将数字 1∼n 排成一排,将会有

    2024年02月12日
    浏览(67)
  • 【算法基础:搜索与图论】3.5 求最小生成树算法(Prim&Kruskal)

    最小生成树 有关树的定义 生成子图 :生成子图是从原图中选取部分节点以及这些节点之间的边所组成的图。生成子图中的所有节点和边都必须在原图中存在。 生成树 :一个连通 无向图 的 生成子图 ,同时要求是树。也即在图的边集中选择 n - 1 条,将所有顶点连通。 我们

    2024年02月16日
    浏览(40)
  • ✔ ★ 算法基础笔记(Acwing)(三)—— 搜索与图论(17道题)【java版本】

    1. 排列数字(3分钟) 每次遍历dfs参数是 遍历的坑位 原题链接 2. n-皇后问题 原题链接 方法 1. 按行遍历(过程中有回溯、剪枝) 思想: 每次递归中,遍历一行的元素,如果可以放皇后,就递归到下一行,下一行中不行了,就返回来,回溯, 方法2. 按每个元素遍历(没有减枝)

    2024年02月05日
    浏览(48)
  • 【算法基础:搜索与图论】3.6 二分图(染色法判定二分图&匈牙利算法)

    https://oi-wiki.org/graph/bi-graph/ 二分图是图论中的一个概念, 它的所有节点可以被分为两个独立的集合,每个边的两个端点分别来自这两个不同的集合 。 换句话说, 二分图中不存在连接同一集合内两个节点的边 。 如何判断一个图是二分图? 当且仅当图中不含奇数环 。(奇数

    2024年02月16日
    浏览(42)
  • 【算法基础:搜索与图论】3.4 求最短路算法(Dijkstra&bellman-ford&spfa&Floyd)

    关于最短路可见:https://oi-wiki.org/graph/shortest-path/ 无向图 是一种 特殊的 有向图。(所以上面的知识地图上没有区分边有向还是无向) 关于存储:稠密图用邻接矩阵,稀疏图用邻接表。 朴素Dijkstra 和 堆优化Dijkstra算法的 选择就在于图 是 稠密的还是稀疏的。 算法步骤: 有一

    2024年02月16日
    浏览(41)
  • 算法基础复盘笔记Day07【搜索与图论】—— Prim、Kruskal、染色体判定二分图、匈牙利算法

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 1. 题目

    2024年02月02日
    浏览(47)
  • 算法基础复盘笔记Day06【搜索与图论】—— Dijkstra、bellman-ford、spfa、Floyd

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 1. 题目

    2023年04月22日
    浏览(44)
  • 【算法】复习搜索与图论

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 蓝桥杯 🌙请不要相信胜利就像山坡上的蒲公英一样唾手可得,但是请相信,世界上总有一些美好值得我们全力以赴,哪怕粉身碎骨!🌙 🍉一起加油,去追寻、去成为更好的自己!

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包