崭新的2013
来源:互联网 发布:这个驸马有淘宝(重生) 编辑:程序博客网 时间:2024/04/26 15:56
bool find(int u)//Hungary{ for (int i = edge[u]; i; i = next[i]) { if (vp[point[i]] == t) continue; vp[point[i]] = t; if (!g[point[i]] || find(g[point[i]])) return g[point[i]] = u, 1; } return 0; } bool bfs()//Hopcroft-Karp{ memset(dist, -1, sizeof(dist)); int l = 1, r = 0; bool ck = 0; for (int i = 1; i <= n; ++i) if (!x[i]) dist[i] = 0, s[++r] = i; for (; l <= r; ++l) { int u = s[l]; for (int i = edge[u]; i; i = next[i]) { int v = point[i]; if (!y[v]) ck = 1; else if (dist[y[v]] == -1) dist[y[v]] = dist[u] + 1, s[++r] = y[v]; } } return ck;} bool dfs(int u){ for (int i = edge[u]; i; i = next[i]) { int v = point[i]; if (!y[v] || (dist[y[v]] == dist[u] + 1 && dfs(y[v]))) return x[u] = v, y[v] = u, 1; } dist[u] = -1; return 0;}int main() { //Hungary for (int i = 1; i <= n; ++i) ++t, ans += find(i); printf("%d\n", ans); //Hopcroft-Karp for (; bfs(); ) for (int i = 1; i <= n; ++i) if (dist[i] == 0 && dfs(i)) ++ans;}