二分图

判定

染色法

 

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++;
    }
}

  

 

posted @ 2020-04-18 09:31  人生有味是清欢  阅读(174)  评论(0编辑  收藏  举报