acwing基础课——二分图

news2024/11/19 13:18:03

由数据范围反推算法复杂度以及算法内容 - AcWing

常用代码模板3——搜索与图论 - AcWing

基本思想:

        二分图:在一张图中,如果能把全部点分到两个集合,且保证两个集合内部没有任何一条边,图中的边只存在于两个集合之间,那么这张图就是二分图。

        这里我们主要介绍染色法(一般用来判定二分图)和匈牙利算法(一般用来计算二分图的最大匹配数)。染色法就是用两种不同的颜色对图中的点进行染色,一个点显然不能具有两种颜色,所以如果出现这样的点,该图就不是二分图,即图中不包含奇数环;匈牙利算法是两个集合分别选一个点,两个点之间有边就确定一条关系,如果某个点的关系被确定了,他会先去看上一个点能否换其他点,如果不能,该点再去找别的点,最后得出的最多的关系数量就是最大匹配数。

860. 染色法判定二分图 - AcWing题库

给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环。

请你判断这个图是否是二分图。

输入格式

第一行包含两个整数 n 和 m。

接下来 m 行,每行包含两个整数 u 和 v,表示点 u 和点 v 之间存在一条边。

输出格式

如果给定图是二分图,则输出 Yes,否则输出 No

数据范围

1≤n,m≤1e5

输入样例:

4 4
1 3
1 4
2 3
2 4

输出样例:

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

using namespace std;

const int N = 100010, M = 200010;//因为是存的无向图,数组就要开两倍才够用

int h[N], e[M], ne[M], idx;
int color[N];
int n, m;

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

bool dfs(int u, int c)
{
    color[u] = c;
    
    for(int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if(!color[j])
        {
            if(!dfs(j, 3 - c)) return false;
        }    
        else if(color[j] == c) return false;
    }
    
    return true;
}

int main()
{
    memset(h, -1, sizeof h);
    
    cin >> n >> m;
    
    while(m--)
    {
        int a, b;
        cin >> a >> b;
        add(a, b);
        add(b, a);
    }
    
    bool flag = true;
    for(int i = 1; i <= n; i++)
    {
        if(!color[i])
        {
            if(!dfs(i, 1))
            {
                flag = false;
                break;
            }
        }
    }
    
    if(flag) cout << "Yes";
    else cout << "No";
    
    return 0;
}

861. 二分图的最大匹配 - AcWing题库

给定一个二分图,其中左半部包含 n1 个点(编号 1∼n1),右半部包含 n2 个点(编号 1∼n2),二分图共包含 m 条边。

数据保证任意一条边的两个端点都不可能在同一部分中。

请你求出二分图的最大匹配数。

二分图的匹配:给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于同一个顶点,则称 M 是一个匹配。

二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。

输入格式

第一行包含三个整数 n1、 n2 和 m。

接下来 m 行,每行包含两个整数 u 和 v,表示左半部点集中的点 u 和右半部点集中的点 v 之间存在一条边。

输出格式

输出一个整数,表示二分图的最大匹配数。

数据范围

1≤n1,n2≤500,
1≤u≤n1,
1≤v≤n2,
1≤m≤1e5,

输入样例:

2 2 4
1 1
1 2
2 1
2 2

输出样例:

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

using namespace std;

const int N = 100010, M = 200010;

int n1, n2, m;
int h[N], e[M], ne[M], idx;
int match[N];//右边的点所对应的左边的点
bool st[N];//判重 避免重复搜索某一个点

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

bool find(int x)
{
    for(int i = h[x]; ~i; i = ne[i])
    {
        int j = e[i];
        if(!st[j])
        {
            st[j] = true;
            if(match[j] == 0 || find(match[j]))//左边的点连接的右边的点没有遍历
//或者该点所连的左边的点能换另一个点连接,那么目前左边的点就能与右边的该点链接
            {
                match[j] = x;
                return true;
            }
        }
    }
    
    return false;
}

int main()
{
    memset(h, -1, sizeof h);
    
    cin >> n1 >> n2 >> m;
    
    while(m--)
    {
        int a, b;
        cin >> a >> b;
        add(a, b);
    }
    
    int res = 0;
    for(int i = 1; i <= n1; i++)//遍历左边每一个点
    {
        memset(st, false, sizeof st);
        if(find(i)) res++;
    }
    
    cout << res;
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制造业ERP如何做好成本核算管理?

随着制造业的不断发展&#xff0c;制造业成本管理中存在的问题已成为制造业企业关注的焦点。在传统粗放的手工模式下&#xff0c;制造企业成本核算工作量会非常巨大&#xff0c;不能对成本信息进行实时监控&#xff0c;只能在成本费用发生后进行归集核算&#xff0c;数据有滞后…

PS CS6视频剪辑基本技巧(四)字幕居中和滚动字幕

在第三讲中介绍了添加字幕的方法&#xff0c;但有的读者可能会发现&#xff0c;字幕模板设定的字幕起始是固定不变的&#xff0c;假如设定的起始位置是最左边&#xff0c;那么无论一行字多有多少个&#xff0c;都是从最左边开始排。那么有没有办法可以让字幕可以批量居中呢&…

大数据技术之SparkCore

文章开篇先简单介绍一下SparkCore&#xff1a; Spark Core是spark的核心与基础&#xff0c;实现了Spark的基本功能&#xff0c;包含任务调度&#xff0c;内存管理&#xff0c;错误恢复与存储系统交互等模块 Spark Core中包含了对Spark核心API——RDD API(弹性分布式数据集)的定…

你以为传切片就是传引用了吗?

xdm &#xff0c;我们在写 golang 的时候&#xff0c;引用和传值傻傻分不清&#xff0c;就例如我们传 切片 的时候&#xff0c;你能分清楚你传的切片是传值还是传引用呢&#xff1f; 引用是什么&#xff1f; 引用就是给对象起另一个名字&#xff0c;引用类型引用另一种类型 引…

【自省】线程池里的定时任务跑的可欢了,可咋停掉特定的任务?

客户端抢到分布式锁之后开始执行任务&#xff0c;执行完毕后再释放分布式锁。持锁后因客户端异常未能把锁释放&#xff0c;会导致锁成为永恒锁。为了避免这种情况&#xff0c;在创建锁的时候给锁指定一个过期时间。到期之后锁会被自动删除掉&#xff0c;这个角度看是对锁资源的…

Going Home(二分图最大权匹配KM算法)

C-Going Home_2022图论班第一章图匹配例题与习题 (nowcoder.com) 在网格地图上有n个小人和n座房子。在每个单位时间内&#xff0c;每个小人都可以水平或垂直地移动一个单位步到相邻点。对于每个小矮人&#xff0c;你需要为他每走一步支付1美元的旅费&#xff0c;直到他进入一所…

Git命令笔记,下载、提交代码、解决冲突、分支处理

下载代码&#xff0c;复制https地址到本地文件夹&#xff0c;鼠标右键选择git bash后输入命令 git clone https://gitee.com/View12138/ViewFaceCore.git 下载后初始化&#xff1a;git init 下载代码后不运行报错&#xff08;如下&#xff09;&#xff0c;需要执行初始化命令…

Google ProtoBuf的使用

Google的protobuf太好用了&#xff0c;又小&#xff0c;读写又快 跑步快慢受鞋的影响太大了&#xff0c;但是造鞋的工具研究起来还是很有难度的&#xff0c;百度真是充斥的大量的转载文件&#xff0c;不管能不能用、能不能看懂&#xff0c;反正是各种转载&#xff0c;有的连错…

2023年企业固定资产管理怎么破局?

2022年已经在风雨中过去&#xff0c;转眼我们迎来了2023年。过去的一年&#xff0c;固定资产管理的痛依旧历历在目&#xff0c;如何让新的一年中&#xff0c;固定资产管理工作有所突破&#xff0c;不再承受固定资产资产管理的痛处&#xff0c;是每个企业管理者和企业固定资产管…

snap打包初步了解

前言 和snap比较类似的有三种打包方式&#xff1a; Snap Flatpak appimage Appimage是将所有的资源打包在一起&#xff0c;以一个类似与独立exe的方式执行&#xff0c;虽然简单使用&#xff0c;但是解压资源和本地缓存数据都比较麻烦。 Flatpak和snap十分类似&#xff0c;但…

XXE无回显攻击详解

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是XXE无回显攻击详解。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设…

怎么把element的tootip设置为点击后出现提示框,且在提示框里面放其他元素,vue2动态给对象添加属性并实现响应式应答,样式穿透

怎么把element的tootip设置为点击后出现提示框 我目前有一个需求&#xff0c;就是要点击文字才会出现提示框&#xff0c;而不是hover上去就以后&#xff0c;找资料看文档&#xff0c;看了半天让我终于实现了&#xff0c;其实也不难&#xff0c;可能是最开始我没有理解value&am…

Akka 进阶(一)Dispatcher调度器

目录一 Dispatcher 任务分发1.1 理解什么是Dispatcher1.2 Executor的分类1.3 基本使用1.4 其他类型的调度器在Akka中&#xff0c;Actor的消息通信和任务执行建立在一个完全透明的调度机制之上&#xff0c;它屏蔽了底层线程&#xff08;池&#xff09;的实现细节&#xff0c;几乎…

Java: static,final,代码块 的详解

Java: static&#xff0c;final&#xff0c;代码块 的详解 每博一文案 山本文绪说过这样一句话&#xff1a;哪些决定放弃了的事&#xff0c;就请放弃得干干净净。哪些决定再也不见面的人&#xff0c;就真 的不要再见面了&#xff0c;不要再做背叛自己的事&#xff0c;如果想要…

CentOS7迷你版安装Redis并配置基础信息

1. 安装gcc、wget依赖 yum install gcc yum install wget 2. 使用命令&#xff1a;wget http://download.redis.io/releases/redis-6.2.5.tar.gz 下载安装包&#xff0c;注意要先cd到要下载到的目标位置&#xff09; 3. tar -zxvf redis-6.2.5.tar.gz 解压压缩包 4. cd redis-…

学习周报-20221223

文章目录一 Linux的ACL访问控制列表一 基础概念1.1 起因1.2 系统支持1.3 相关定义二 查看ACL权限2.1 简单查看2.2 详细查看2.3 具体配置三 更改ACL权限3.1 添加或修改ACL3.2 输出和输入3.3 设置ACL掩码3.4 递归修改ACL3.5 删除ACL3.6 控制默认ACL权限二 Linux磁盘分区中物理卷&…

zabbix6.0安装教程(七):从web界面安装

zabbix6.0安装教程&#xff08;七&#xff09;&#xff1a;从web界面安装 目录一、欢迎主界面二、先决条件检查三、配置数据库连通性四、配置本章节提供有关Zabbx Web界面的部署步骤说明。Zabbix 前端是由PHP语言编写&#xff0c;所以其网页服务的运行需要支持PHP语言的网站服务…

Allegro如何任意角度走线操作指导

Allegro如何任意角度走线操作指导 Allegro支持在PCB上进行任意角度走线,尤其是在高速设计的时候,尤为常见,如下图 具体操作如下 选择add connect命令Find选择Cline segs

谷歌要给移动VR定规矩

代号牛轧糖的最新安卓7.0手机操作系统发布两天后&#xff0c;谷歌公司开发的虚拟现实&#xff08;VR&#xff09;平台Daydream&#xff08;下称“白日梦”&#xff09;也将在未来几周推出。与平台一同推出的&#xff0c;还有来自Hulu和YouTube等视频网站“网红”们的全新视频内…

【软件工程】实验3:软件详细设计

CAM系统的类图 CAM系统的顺序图 CAM系统模拟实现&#xff08;CAM工具库封装&#xff09; 1、代码运行界面 &#xff08;1&#xff09;根据提示输入要加工的图形类型 &#xff08;2&#xff09;J-Soft软件会根据输入的数字提示用户输入不同的图形参数&#xff0c;图形参数输入…