【蓝桥集训18】二分图(2 / 2)

二分图定义:将所有点分成两个集合,使得所有边只出现在集合之间,就是二分图

目录

860. 染色法判定二分图 

1、dfs

2、bfs

861. 二分图的最大匹配 - 匈牙利算法ntr算法


860. 染色法判定二分图 

活动 - AcWing

1、dfs

思路:

  • 对每一个未染色的点进行dfs,如果有一个点染色失败,说明该图不是二分图
  • 在dfs中,先对该点染色,接着遍历所有相邻节点
  • 如果相邻的点颜色和该点相同,说明该图不是二分图
  • 如果相邻点未染色,则将该点染成相反色,并递归其相邻点
  • 如果所有点均为出现染色失败的情况,则该图为二分图
import java.util.*;

class Main
{
    static int N=100010,M=N*2;
    static int[] h=new int[N],e=new int[M],ne=new int[M],color=new int[N];
    static int idx;
    
    public static void add(int a,int b)
    {
        e[idx]=b;ne[idx]=h[a];h[a]=idx++;
    }
    
    public static boolean dfs(int u,int c)
    {
        color[u]=c; //先给该点染色
        
        for(int i=h[u];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(color[j]==c) return false; //如果相邻点染色与该点一样
            if(color[j]==0&&!dfs(j,3-c)) return false;  //如果未染色且染色失败
        }
        return true;
    }
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        
        Arrays.fill(h,-1);
        
        int n=sc.nextInt(),m=sc.nextInt();
        for(int i=0;i<m;i++)
        {
            int a=sc.nextInt(),b=sc.nextInt();
            add(a,b); add(b,a);
        }
        
        for(int i=1;i<=n;i++)
            if(color[i]==0)
                if(!dfs(i,1))
                {
                    System.out.print("No");
                    return;
                }
        System.out.print("Yes");
    }
}

2、bfs

思路:

  • 对每一个未染色的点进行bfs
  • 在bfs中,先给该点染色,将其放入队列
  • 队列循环放出与其相邻节点,如果有节点色和该点相同,则不是二分图
  • 否则将未染色的点,染与该点相反的色,存入队列中
  • 如果队空,没有出现染色失败的情况,则该图是二分图
import java.util.*;

class Main
{
    static int N=100010,M=N*2;
    static int[] h=new int[N],e=new int[M],ne=new int[M],color=new int[N];
    static int idx;
    
    public static void add(int a,int b)
    {
        e[idx]=b;ne[idx]=h[a];h[a]=idx++;
    }
    
    public static boolean bfs(int u)
    {
        color[u]=1; //先给该点染色
        Queue<PII> q=new LinkedList<>();
        q.offer(new PII(u,1));
        
        while(!q.isEmpty())
        {
            PII t=q.poll();
            int p=t.x,c=t.y;
            
            for(int i=h[p];i!=-1;i=ne[i])
            {
                int j=e[i];
                if(color[j]==c) return false;
                if(color[j]==0)
                {
                    q.offer(new PII(j,3-c));
                    color[j]=3-c;
                }
            }
        }
        return true;
        
    }
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        
        Arrays.fill(h,-1);
        
        int n=sc.nextInt(),m=sc.nextInt();
        for(int i=0;i<m;i++)
        {
            int a=sc.nextInt(),b=sc.nextInt();
            add(a,b); add(b,a);
        }
        
        for(int i=1;i<=n;i++)
            if(color[i]==0)
                if(!bfs(i))
                {
                    System.out.print("No");
                    return;
                }
        System.out.print("Yes");
    }
}

class PII
{
    int x,y;
    PII(int x,int y)
    {
        this.x=x;
        this.y=y;
    }
}

 

861. 二分图的最大匹配 - 匈牙利算法ntr算法

活动 - AcWing

思路

匹配:在图论中,一个「匹配」是一个边的集合,其中任意两条边都没有公共顶点

最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配

 

import java.util.*;

class Main
{
    static int N=510,M=100010;
    static int[] h=new int[N],e=new int[M],ne=new int[M];
    static int[] st=new int[N]; //用于标记已经考虑过的妹子
    static int[] match=new int[N]; //用于记录当前妹子的对象
    static int idx;
    
    public static void add(int a,int b)
    {
        e[idx]=b;ne[idx]=h[a];h[a]=idx++;
    }
    
    public static boolean find(int u)
    {
        //枚举这个男生看上的所有妹子
        for(int i=h[u];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(st[j]==0) //如果这个妹子未匹配成功
            {
                st[j]=1;
                if(match[j]==0||find(match[j])) //如果这妹子没对象or妹子有对象,但她对象有备胎
                {
                    match[j]=u; //两对皆大欢喜,妹子换了新对象,前任跟备胎在一起了,两对匹配成功
                    return true;
                }
            }
        }
        return false;
    }
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        
        Arrays.fill(h,-1);
        
        int n1=sc.nextInt(),n2=sc.nextInt(),m=sc.nextInt();
        for(int i=0;i<m;i++)
        {
            int a=sc.nextInt(),b=sc.nextInt();
            add(a,b);  //只需要男生找女生
        }
        
        int res=0;
        for(int i=1;i<=n1;i++) //遍历每个男生
        {
            Arrays.fill(st,0);  //从头开始考虑妹子
            if(find(i)) res++;  //如果这个男生能找到妹子,则匹配数+1
        }
        System.out.print(res);
    }
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

白农:Imagination将继续致力于推进车规半导体IP技术创新和应用

4月2日Imagination中国董事长白农在中国电动汽车百人论坛上发表演讲&#xff0c;探讨了车规半导体核心IP技术如何推动汽车智能化发展&#xff0c;并接受了媒体采访。本次论坛上&#xff0c;他强调了IP技术在汽车产业链中日益重要的地位和供应商的位置前移。类比手机行业的发展&…

树、森林、二叉树:相互之间的转换

你好&#xff0c;我是王健伟。 前面我们讲过了各种二叉树&#xff0c;这方面的知识已经够多的了&#xff0c;本节就来讲一讲更通用的概念&#xff1a;树、森林以及与二叉树之间的转换问题。 树的存储结构 前面我们学习了树形结构的基本概念&#xff0c;在满足这个概念的前提…

python 包、模块学习总结

、模块基础 1、基本概念 模块是最高级别的程序组织单元&#xff0c;它将程序代码和数据封装起来以便重用。从实际角度来看&#xff0c;模块往往对应于python程序文件&#xff08;或是用外部语言如C、Java或C#编写而成的扩展&#xff09;。每一个文件都是一个模块&#xff0c;并…

小驰私房菜_11_mm-camera 添加客制化分辨率

#小驰私房菜# #mm-camera# #客制化分辨率# 本篇文章分下面几点展开&#xff1a; 1) mm-camera框架下&#xff0c;是在哪个文件添加客制化分辨率&#xff1f; 2&#xff09; 新添加分辨率的stall duration如何计算&#xff1f; 3&#xff09; 新添加的分辨率会有哪些影响&…

CentOS7操作系统离线安装docker

前言 有时候我们没有办法联网安装各种软件包&#xff0c;这时候就需要提前下载好所需要的包&#xff0c;然后把包上传到服务&#xff0c;在服务器上进行安装。 今天我们一起来探讨了在centos7操作系统上&#xff0c;安装docker。 专栏地址&#xff1a;容器管理 &#xff0c;…

ChatGLM-6B (介绍相关概念、基础环境搭建及部署)

文章目录前言一、ChatGLM-6B是什么&#xff1f;二、安装虚拟的python环境1.下载2.安装3.设置国内源(危险)4.虚拟环境使用简介三、部署ChatGLM-6B1. clone代码2. 运行1.创建虚拟环境2.装包2.1 找到合适的pytorch版本2.1 安装依赖2.2 验证pytorch是否为GPU版本3.运行四、部署过程…

银行数字化转型导师坚鹏:银行对公客户数字化场景营销案例萃取

银行对公客户数字化场景营销案例萃取与行动落地课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚银行数字化营销与场景营销内涵&#xff1f; 不知道如何开展对公客户数字化营销工作&#xff1f; 不知道对公业务数字化场景营销成功案例&#xff1f; 学员收获&a…

5.39 综合案例2.0 - ESP32蓝牙遥控小车3(摇杆控制)

综合案例2.0 - 蓝牙遥控小车1- 摇杆控制成品展示案例说明器件说明小车连线小车源码PS2摇杆手柄遥控连线摇杆代码成品展示 案例说明 用STM32单片机做了一辆蓝牙控制的麦轮小车&#xff0c;分享一下小车的原理和制作过程。 控制部分分为手机APP&#xff0c;语音模块控制&#xf…

【AI绘图学习笔记】self-attention自注意力机制

台大李宏毅21年机器学习课程 self-attention和transformer 文章目录不同模态的输入和输出Sequence LabelingSelf-attentionMulti-head Self-attentionPositional EncodingSelf-attention的应用Self-attention对比其他算法vs CNNvs RNN总结不同模态的输入和输出 之前我们所讲的一…

SpringBoot学习笔记--数据库操作

文章目录7.1 JDBCHikariDataSource7.2 整合 Druid 到 Spring-Boot7.1 JDBCHikariDataSource 需求&#xff1a;演示 Spring Boot 如何通过 jdbcHikariDataSource 完成对 Mysql 操作 说明: HikariDataSource : 目前市面上非常优秀的数据源, 是 springboot2 第一步、创建测试数…

代码随想录Day44

今天继续学习通过动态规划解决问题 96.不同的二叉搜索树 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5 思路…

数据存储的细致介绍

本文介绍内容&#xff1a; 1&#xff1a;数据类型的详细介绍 2&#xff1a;整形的存储&#xff1a;原码&#xff0c;反码&#xff0c;补码 3&#xff1a;大小端字节序 4&#xff1a;浮点型的存储 一&#xff1a;数据类型的归类 1&#xff1a;整形家族(包括无符号&#xff09; …

Web 攻防之业务安全:本地加密传输测试.

Web 攻防之业务安全&#xff1a;本地加密传输测试. 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台&#xff08;操作系统、数据库&#xff0c;中间件等&#xff09;、业务系统自身&#xff08;软件或设备&#xff09;、业务所提…

蓝桥杯·3月份刷题集训Day07

本篇博客旨在记录自已打卡蓝桥杯3月份刷题集训&#xff0c;同时会有自己的思路及代码解答希望可以给小伙伴一些帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误之处&#xff0c;希望小伙伴们可以在评论区指出来&#xff0c;共勉&#x1f4aa;。 文…

【C++修行之路】面向对象三大特性之多态

文章目录前言认识多态构成多态的必要条件虚函数的重写虚函数重写的两个例外final和override重载、覆盖、隐藏抽象类多态的原理单继承多继承重写了基类的虚函数没有重写基类的虚函数菱形继承和菱形虚拟继承的虚表补充补充继承与多态相关问题inline函数可以是虚函数吗&#xff1f…

ChatGPT这么火,我们能怎么办?

今天打开百度&#xff0c;看到这样一条热搜高居榜二&#xff1a;B站UP主发起停更潮&#xff0c;然后点进去了解一看&#xff0c;大体是因为最近AI创作太火&#xff0c;对高质量原创形成了巨大冲击&#xff01;记得之前看过一位UP主的分享&#xff0c;说B站UP主的年收入大体约等…

iptables防火墙详解

文章目录一、iptables概念1、防火墙基础1.1 防火墙概念1.2 Netfilter和iptables的区别2、Iptables的表、链结构2.1 规则链2.2 规则表2.3 规则表之间的顺序3、规则3.1 匹配条件3.2 处理动作二、iptables规则管理1、iptables规则操作1.1 iptables信息查询1.2 规则添加1.3 规则删除…

Ant Design Vue的汉化

Ant Design Vue的汉化 1. 引入依赖 import zhCN from "ant-design-vue/lib/locale-provider/zh_CN"; // 汉化 export default {data () {zhCN,} }2. 标签包裹需要汉化的组件 <a-config-provider :locale"zhCN"><a-table :row-selection"ro…

C++IO流

文章目录一、CIO流体系二、C标准IO流三、C文件IO流1.ifstream2.ofstream一、CIO流体系 C流是指信息从外部输入设备向计算机内部输入&#xff0c;从内存向外部输出设备输出的过程&#xff0c;这种输入输出的过程非常形象地被称为流的概念。IO流指的就是输入输出流。 我们平时对…

PerfEnforce Demonstration: Data Analytics with Performance Guarantees

PerfEnforce Demonstration: Data Analytics with Performance Guarantees Created by: ctur Date: April 2, 2023 2:54 PM Status: ready to start 实时响应式的扩展算法 实时响应式的扩展算法分为 1. 比例积分控制 2. 强化学习 比例积分控制方法 “We use a proportiona…
最新文章