二分图

Posted cqyinsist

tags:

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

染色法判断二分图

算法流程

1.找到未染色的点,为他染色
2.检测所有与染色的点相连接的点,颜色相同,不是二分图,未被染色,为他染色
3.重复步骤1,2直到所有的点都被染色,或者已经判断出他不是二分图。

代码实现

#include<iostream>
#include<cstring>
using namespace std;
const int N=100010;
int h[N],r[2*N],v[2*N],tot=1;
void add(int x,int y){
    r[tot]=h[x],v[tot]=y,h[x]=tot++;
}
int color[N];
bool dfs(int u,int c){
    color[u]=c;
    for(int j = h[u];j;j=r[j]){
        int y=v[j];
        if(color[y]==c)return false;
        if(color[y]==0&&!dfs(y,-c))return false;
    }
    return true;
}
int main(){
    int n,m,x,y;
    cin>>n>>m;
    for(int i = 0;i<m;i++){
        cin>>x>>y;
        add(x,y);add(y,x);
    }
    for(int i = 1;i<=n;i++){
        if(color[i]==0){
            if(!dfs(i,1)){
                cout<<"No"<<endl;
                return 0;
            }
        }
    }
    cout<<"Yes"<<endl;
}

匈牙利算法

算法流程

1.为还没有匹配的左半部节点,匹配右半部节点
2.匹配过程如果右半部节点未被被占用或占用该节点的,左半部节点,可以占用另一个右半部节点。那么可以进行匹配,否则匹配失败
3.重复步骤1,2;直到所有的节点都进行了一次匹配。

代码

#include<iostream>
#include<cstring>
using namespace std;
const int N = 510,M=100010;
int h[N],r[M],v[M],tot=1;
void add(int x,int y){
    r[tot]=h[x],v[tot]=y,h[x]=tot++;
}
int match[N];
bool st[N];
bool find(int x){
    for(int y = h[x];y;y=r[y]){
        if(!st[v[y]]){
            st[v[y]]=true;
            if(!match[v[y]]||find(match[v[y]])){
                match[v[y]]=x;
                return true;
            }
        }
    }
    return false;
}
int main(){
    int n1,n2,m,x,y;
    cin>>n1>>n2>>m;
    for(int i = 1;i<=m;i++){
        cin>>x>>y;
        add(x,y);
    }
    int res=0;
    for(int i=1;i<=n1;i++){
        memset(st,0,sizeof st);
        if(find(i)) res++;
    }
    cout<<res<<endl;
}




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

如何将 r ggplot 图存储为 html 代码片段

二分图

模板判断二分图

二分图匹配(模板)

HDU 2236 无题II(二分图匹配+二分)

二分图——匈牙利算法简述