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;
}
崭新的2013
最新推荐文章于 2014-02-20 11:47:43 发布