ACM入门之二分图

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM入门之二分图相关的知识,希望对你有一定的参考价值。


性质 :

  • 如果两个集合中的点分别染成黑色和白色,可以发现二分图中的每一条边都一定是连接一个黑色点和一个白色点。
  • 二分图不存在长度为奇数的环(因为每一条边都是从一个集合走到另一个集合,只有走偶数次才可能回到同一个集合。)

染色法判定二分图模板

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*3+10;
int h[N],e[N],ne[N],idx;
int st[N],n,m;
void add(int a,int b)

    e[idx]=b,ne[idx]=h[a],h[a]=idx++;

bool dfs(int u,int c)

    st[u]=c;
    for(int i=h[u];i!=-1;i=ne[i])
    
        int j=e[i];
        if(!st[j]&&!dfs(j,3-c)) return false;
        else if(st[j]&&st[u]==st[j]) return false;
    
    return true;

int main(void)

    memset(h,-1,sizeof h);
    cin>>n>>m;
    while(m--)
    
        int a,b; cin>>a>>b;
        add(a,b),add(b,a);
    
    bool flag=1;
    for(int i=1;i<=n;i++)
        if(!st[i]&&!dfs(i,1)) flag=0;
        if(!flag) break;
    
    if(flag) puts("Yes");
    else puts("No");
    return 0;

匈牙利算法解决二分图的最大匹配模板

const int N=510;
const int M=1e5+10;
int h[N],e[M],ne[M],idx;
int st[N],match[N];
int n1,n2,m;
void add(int a,int b)

    e[idx]=b,ne[idx]=h[a],h[a]=idx++;

bool find(int u)

    for(int i=h[u];i!=-1;i=ne[i])
    
        int j=e[i];
        if(!st[j])
        
            st[j]=1;
            if(match[j]==0|| find(match[j]))
            
                match[j]=u;
                return true;
            
        
    
    return false;

void init()

 	int res=0;
    for(int i=1;i<=n1;i++)
    
        memset(st,0,sizeof st);
        if(find(i)) res++;
    
    cout<<res;

860. 染色法判定二分图
861. 二分图的最大匹配

以上是关于ACM入门之二分图的主要内容,如果未能解决你的问题,请参考以下文章

ACM入门之欧拉图

ACM入门之分层图

HDU 1083 网络流之二分图匹配

ACM入门之连通性

ACM入门之拓扑排序

ACM模板判断二分图+二分图最大匹配