崭新的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;}

原创粉丝点击