跳转至

二分图判定

约 381 个字 38 行代码 预计阅读时间 2 分钟

二分图相关概念

图的点集可以被分为两部分,每一部分的内部都没有连边

完全二分图/满二分图(Complete bipartite graph/Biclique): 二分图中任何两个不在同一部分的点之间都有连边

匹配(Matching)(又叫边独立集 (Independent edge set)): 对于图G,E的子集E'中任意两条不同的边都没有公共的端点, 且E'中任意一条边都不是自环,则E'是图G的一个匹配, 例子: 一夫一妻制,任一丈夫都只有一个妻子,任一妻子都只有一个丈夫

如果一个点是匹配中某条边的一个端点, 则称这个点是 被匹配的 (matched)/饱和的 (saturated), 否则称这个点是 不被匹配的 (unmatched)。

极大匹配(Maximal matching): 一个匹配,满足加入任何一条边后都不再是一个匹配

最大匹配(Maximum-cardinality matching): 边数最多的匹配 最大的极大匹配就是最大匹配

最大权匹配 (Maximum-weight matching): 边权之和最大的匹配

完美匹配 (Perfect matching): 一个匹配,满足所有点都是被匹配的

增广路径(Augmenting path): 一个匹配M,满足一条路径以非匹配点为起点和终点,每相邻两条边的其中一条在匹配中而另一条不在匹配中

二分图判定

按照和起点的距离的奇偶性分类,黑白染色,若相同奇偶性不同色,则不是二分图

int col[N];
vector<int> ed[N];
bool judgeBfs(int r)
{
    col[r]=1;
    queue<int> d;
    d.push(r);
    int u;
    while(!d.empty())
    {
        u=d.front();
        d.pop();
        for(int v:ed[u])
        {
            if(col[v]==0)
            {
                col[v]=-col[u];
                d.push(v);
            }
            else if(col[v]==col[u])
                return false;
        }
    }
    return true;
}
bool judge()
{
    memset(col,0,sizeof(col));
    for(int i=1;i<=n;++i)
    {
        if(!col[i])
        {
            if(!judgeBfs(i))
                return false;
        }
    }
    return true;
}