--二分图

二分图

1 二分图(又称为二部图或偶图)是一种无向图;其中的顶点可以分为两个交集为空的集合X和集合Y,对于图中每条边,其中一个端点在X中,另外一个端点在Y中,且X和Y内部顶点之间没有边

–如果集合X和集合Y中每对顶点之间都有且只有一条边的图称为完全二分图

2 二分图的判定方式:

采用染色的方法:采用两个颜色来代表两个集合的顶点(以黄色,红色为例子)
-每次选择一个未被染色的顶点x,先将其染为黄色,接着从x出发做dfs遍历x所在的连通块
-在dfs的过程中,假如现在枚举到了边u->v,如果v还没有被染色,则把v染成和u不同的颜色,如果u和v的颜色相同,说明此图不是二分图
-如果顺利遍历完图中所有的连通块,说明为二分图

3Code:

vector<int> edge[N+5];
int n,m,c[N+5];
bool dsf(int x){
    for(auto y:edge[x]){
        if(!c[y]){
            c[y]=3-c[x];
            if(!dfs(y))
                return false;
        }else{
            if(c[x]==c[y]) return false;
        }
    }
    return true;
}
bool check(){
    memset(c,0,sizeof(c));
    for(int i=1;i<=n;i++){
        if(!c[i]){
            c[i]=1;
            if(!dfs(i)) return false;//这时每次dfs一个连通块
        }
    }
    return true;
}

4二分图匹配:

把二分图G=<v,E>的顶点集V拆分成V1,V2(V1<V2 顶点个数), 选取一些边E2包含于E
  如果E2任意两条边都没有相同的顶点,称E2为G的匹配
  G中边数最多的匹配称为G的最大匹配,其中包含的边数成给G的匹配数
  如果G的最大匹配包含边数=min(V1,V2)的顶点个数,称此匹配为完全匹配

5二分图的最大匹配:对于二分图G=<V,E>及顶点集V1,V2,假设我们现有匹配是M,我们尝试是否有更优的方案。–时间复杂度O(nm)

交错路径:如果P是G中的一条路径,并且对于P上每一对相邻的边(端点包含同一个顶点),都满足其中一条在匹配M中,而另一条不咋
增广路径:P是条交错路径,并且路径的起点和终点都未被匹配
-如果我们能找到增广路径P,那么M异或P(对于一条边,如果它同时出现/不出在在M和P里,则它不出现在M异或P中,否则处在在M异或P中)就是一组更优的匹配
//二分图的最大匹配方式就是不断寻找新的增广路,来优化现有匹配
//二分图分为左边的点和右边的点,我们只要依次从左边的点开始寻找增广路就行
vector<int> edge[N+5];//记录左边的连接的边即可,我们只需遍历左边的点
int n,m,n1,n2,v[N+5];//n1,n2表示左右两边点的个数,v表示右边的点连接左边点的编号
bool b[N+5];//b数组来表示左边的点是否已经寻找过增广路
bool find(int x){
    b[x]=true;
    for(auto y:edge[x]){
         if(!v[y]||(!b[v[y]]&&find(v[y]))){
         v[y]=x;
             return true;
        }
        //这个if语句表示的是如果x连接的点y还没有被选中,或者y已经被选中,但是选中y的点还没寻找过增广路,那我们就从选中y的这个点开始寻找增广路
    }
    return false;
}
int match(){
    int ans=0;
    memset(v,0,sizeof(v));
    for(int i=1;i<=n1;i++){
        memset(b,false,sizeof(b));
        if(find(i))
            ++ans;
    }
    return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值