搜索与图论(acwing算法基础)

news/2024/7/15 17:39:32 标签: 算法, 图论, 深度优先

文章目录

    • DFS
      • 排列数字
      • n皇后
    • BFS
      • 走迷宫
    • 拓扑序列
      • 单链表
      • 树与图的深度优先搜索
      • 模拟队列
      • 有向图的拓扑序列
    • bellman-ford
      • 有边数限制的最短路
    • spfa
      • spfa求最短路
      • spfa判断负环
    • Floyd
      • Floyd求最短路
    • Prim
    • Kruskal
      • Kruskal算法求最小生成树
    • 染色法判定二分图
      • 染色法判定二分图

DFS

排列数字

#include<iostream>
using namespace std;
int n ;
int a[10];
bool s[10];
void dfs(int u)
{
    if(u == n)
    {
        for(int i = 0 ; i <n ; i++) cout << a[i] << " " ;
        cout << endl ;
        return;
    }
    
    for(int i = 1; i <= n ; i++)
    {
        if(!s[i])
        {
            a[u] = i;
            s[i] = true ;
            dfs(u+1);
            a[u] = 0 ;
            s[i] = false;
        }
    }
    
    
}
int main()
{
    cin >> n ;
    dfs(0);
    return 0;
}

n皇后

#include<iostream>
using namespace std;
const int N = 20 ;
char g[N][N] ;
bool c[N], x[N] , y[N];
int n , m ;
void dfs(int u)
{
    if(u == n)
    {
        for(int i = 0 ; i < n; i++) cout << g[i] << endl;
        cout << endl;
        return ;
    }
    for(int i = 0 ; i < n ; i++)
    {
        if(!c[i] && !x[u+i] && !y[u-i+n])
        {
            c[i] = x[u+i] = y[u-i+n] = true ;
            g[u][i] = 'Q';
            dfs(u+1);
            g[u][i] = '.';
            c[i] = x[u+i] = y[u-i+n] = false ;
        }
    }
}
int main()
{
    cin >> n;
    for(int i = 0 ; i < n ; i++)
        for(int j = 0 ; j < n ; j++)
            g[i][j] = '.' ;
    
    dfs(0);        
    return 0 ;
}

BFS

走迷宫

#include<iostream>
#include<cstring>
using namespace std;
typedef pair<int,int> PII ;
const int N = 110 ;
PII q[N * N];
int f[N][N] , d[N][N];
int n , m ;
int dx[] = {0,1,0,-1} , dy[] = {1,0,-1,0} ;
int bfs()
{
    memset(d , -1 , sizeof d);
    d[1][1] = 0 ;
    q[0] = {1,1};
    int hh = 0 , tt = 0 ;
    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<=n &&x>0 && y<=m && y>0 && d[x][y] == -1 && f[x][y] == 0)
            {
               q[++tt] = {x,y};
               d[x][y] = d[t.first][t.second] + 1 ;
            }
        }
    }
    return d[n][m];
}
int main()
{
    cin >> n >> m ;
    for(int i = 1 ; i <= n ; i++)
        for(int j = 1 ; j <= m ; j++)
            cin >> f[i][j];
    
    cout << bfs();
    return 0;
}

拓扑序列

单链表

点击跳转至例题
在这里插入图片描述
在这里插入图片描述
idx存的是指针

树与图的深度优先搜索

树的重心
在这里插入图片描述

每个节点都是一个单链表

模拟队列

hh = 0 , tt = -1

有向图的拓扑序列

在这里插入图片描述
都是从前指向后,即有向无环图(不能有环)
所有入度为0的点,都能排在前面的位置

在这里插入图片描述
删掉t->j的边,仅仅是j的入度减一,当j的入度为0的时候,放入队列

#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5 + 10;
int n , m ;
int e[N] , h[N] , ne[N] , idx;
int d[N] , q[N];
void add(int a , int b)
{
    e[idx] = b , ne[idx] = h[a] , h[a] = idx++;
}
bool topool()
{
    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 x,y;
        cin >> x >> y;
        add(x,y);
        d[y]++;
    }
    if(topool())
    {
        for(int i = 0 ; i < n ; i++) cout << q[i] << " " ;
    }
    else cout << -1 ;
    return 0;
}

bellman-ford

有边数限制的最短路

spfa

spfa求最短路

spfa判断负环

Floyd

Floyd求最短路

Prim

Prim算法求最小生成树

Kruskal

Kruskal算法求最小生成树

染色法判定二分图

染色法判定二分图


http://www.niftyadmin.cn/n/416335.html

相关文章

Docker Cgroups资源控制操作

资源控制 Docker 通过 Cgroup 来控制容器使用的资源配额&#xff0c;包括 CPU、内存、磁盘三大方面&#xff0c; 基本覆盖了常见的资源配额和使用量控制。 Cgroup 是 ControlGroups 的缩写&#xff0c;是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如…

使用卷积神经网络构建一个图像分类模型

在本文中&#xff0c;我们将详细介绍如何使用卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;构建一个图像分类模型。我们将从理论基础开始&#xff0c;然后通过编写代码来实现一个完整的模型&#xff0c;并在一个实际的数据集上进行训练和…

3072. 减肥

Powered by:NEFU AB-IN Link 文章目录 3072. 减肥题意思路代码 3072. 减肥 题意 小明是一个大胖子&#xff0c;为了让体重达到正常水平&#xff0c;他的计划是&#xff1a;减掉 n 千克体重&#xff0c;分多周完成(至少是 2 周)&#xff0c;每周都减重正整数千克。为了激励自己…

基于K8S部署ZooKeeper准备知识(StatefulSet)

使用k8s部署zk时&#xff0c;会部署一个headless service.科普一下headless service: Headless Service&#xff08;无头服务&#xff09;是 Kubernetes 中的一种服务类型&#xff0c;它与普通的 ClusterIP 服务有所不同。普通的 ClusterIP 服务会为每个服务分配一个虚拟 IP 地…

工厂模式:简化对象创建,提升代码灵活性的设计模式入门指南

目录 导言&#xff1a;工厂模式的概念工厂模式的优势2.1. 封装对象的创建逻辑&#xff1a;2.3. 实现松耦合&#xff1a; 简单工厂模式示例工厂方法模式示例抽象工厂模式示例结论&#xff1a; 导言&#xff1a; 在软件开发中&#xff0c;对象的创建和初始化是一个常见的任务。为…

Flask学习-环境配置

目录 一.环境部署 二.Flask基本结构 三.完整代码 四.运行效果 一.环境部署 在安装好python&#xff0c;pip环境的基础上在命令行输入如下指令&#xff1a; pip install flask flask框架即安装完毕。 二.Flask基本结构 flask的使用通过创建实例实现。创建方法如下&…

ROS学习——通信机制(话题通信①—发布方实现)

2.1 话题通信 Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 040话题通信(C)1_发布方框架_Chapter2-ROS通信机制_哔哩哔哩_bilibili 一、ROS 中的基本通信机制主要有如下三种实现策略 话题通信(发布订阅模式服务通信(请求响应模式)参数服务器(参数共享模式) 二、…

数据传输中的数据转换与处理的常用方法-物联网开发-单片机通信

目录 一、前言 二、实践与代码 1.Unsigned Char 2.memset 3.sprintf 4.atoi 5.atof 6.strcmp 7.strtok 8.strlen 9.strcpy 10.strcat 三、总结 一、前言 本文将以STM32单片机为基础&#xff0c;使用Keil5环境展示以下方法。 在单片机通信、载波通信中&#xff0c;常常涉及数…