1匈牙利算法
int match(int x) {
for (int i = 1; i <= m; i++) {
if (g[x][i] == 1 && vis[i] == 0) {
vis[i] = 1;
if (p[i] == 0 || match(p[i]) == 1) {
p[i] = x;
return 1;
}
}
}
return 0;
}
贪心,不断扩大匹配
两个结论:最大匹配数=最小点覆盖
总数=总独立集数减最小点覆盖
2.欧拉图
遍历整个图,先遍历再入栈,搞定,
for (int &i = head[x]; i != 0; i = nex[i]) {
int tmp = i;
if (op[tmp % m] == 0) {
op[tmp % m] = 1;
dfs(v[tmp]);
top++;
stk[top] = tmp;
}
}