二分图

判定

染色法

bool dfs(int x, int color) {
    v[x] = color;
    for (unsigned int i = 0; i < e[x].size(); i++) {
        int y = e[x][i].first;
        if (v[y]) {
            if (v[y] == color) return 0;
        } else {
            if (!dfs(y, 3 - color)) return 0;
        }
    }
    return 1;
}

匹配

1要素

一个节点一定有链接一条匹配变

0要素

同一集合内无边相连

最大匹配+匈牙利

bool dfs(int x)
{
    for(int y=1;y<=m;y++)
    {
        if(flag[x][y]||vis[y])
            continue;
        vis[y]=1;
        if(!fri[y]||dfs(fri[y]))
        {
            fri[y]=x;
            return 1;
        }
    }
    return 0;
}
int main(){
for(int i=1;i<=n;i++)
    {
        memset(vis,0,sizeof(vis));
        if(dfs(i))
            ans++;
    }
}

  

原文地址:https://www.cnblogs.com/ruanmowen/p/12724225.html