ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二分图总结

2021-10-13 18:33:55  阅读:204  来源: 互联网

标签:二分 总结 匹配 覆盖 int 路径 cy cx


二分图

1.二分图<->不存在奇数环<->染色法不存在矛盾

2.匈牙利算法,匹配,最大匹配,匹配点,增广路径

最大匹配<->不存在增广路径

从左边的非匹配点,沿着一条非匹配边,走到一个匹配点,再沿着一条匹配边,走到一条匹配点,最后...到一个对面的非匹配点

3.最小点覆盖,最大独立集,最小路径点覆盖,最小路径重复点覆盖

最大匹配数=最小点覆盖=总点数-最大独立集=总点数-最小路径点覆盖

二分图中最小点覆盖=最大匹配数

最大独立集:选出最多的点,使得选出的点之间没有

<->去掉最少的点,将所有边都破坏掉

<->找最小点覆盖

最小路径点覆盖:对于一个DAG(有向无环图),用最少的互不相交(点不重合)的路径覆盖所有点

DAG.png

最小路径重复点覆盖:在原图上求传递闭包后,做最小路径点覆盖

QQ截图20211009103423.png

把原图的重复点覆盖的路径集合叫G,传递闭包图的点覆盖集合叫G‘。

对于左边的每一条路径,如果路径中的点已经被选过,就跳过这个点,即转化成了右边的一种

对于右边的每一条路径,如果有闭包边,就把它展开成有重复点的边,即转化成了左边的一种

最大团:选出最多的点,使得选出的点之间

4.最优匹配,KM算法

5.多重匹配

经典题:棋盘覆盖

将每一个1*2的方块用中间的那一个边来代替。这样原题意转化为最多能找多少个边,他们两两没有任何交点。即是一个最大匹配问题

这里注意到棋盘中的每一个点(x,y)以x+y的奇偶性二染色,这样每两个相邻的点之间的边是二分图中的一个边,转化为二分图上的最大匹配问题

即直接套用匈牙利算法模板

#include <iostream>
#include <cstring>
#include <algorithm>
#define x first
#define y second

using namespace std;
const int N = 110;
int n;
typedef pair<int, int> PII;
PII match[N][N];
bool st[N][N];
bool block[N][N];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
bool find(int x,int y){
    for(int i=0;i<4;i++){
        int cx=x+dx[i],cy=y+dy[i];
        if(cx<1||cx>n||cy<1||cy>n)continue;
        if(block[cx][cy])continue;
        if(!st[cx][cy]){
            st[cx][cy]=true;
           
            
            if(!match[cx][cy].x||find(match[cx][cy].x,match[cx][cy].y)){
                match[cx][cy]={x,y};
                return true;
            }  
        }
        
    }
    return false;
}
int main(){
    int t;
    cin>>n>>t;
    while(t--){
        int x,y;
        cin>>x>>y;
        block[x][y]=1;
    }
    int res=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            if((i+j)%2){
                memset(st,0,sizeof st);
                if(!block[i][j]&&find(i,j))res++;
                
            }
        }
    cout<<res<<endl;
}

标签:二分,总结,匹配,覆盖,int,路径,cy,cx
来源: https://www.cnblogs.com/codjjj/p/15403450.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有