判定
染色法
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++;
}
}