[UOJ79]一般图最大匹配

Posted storz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[UOJ79]一般图最大匹配相关的知识,希望对你有一定的参考价值。

带花树,那是啥?

每次复杂度 (O(nm)) 随机5次似乎就卡不掉(起码现在uoj上没有能卡掉这个的

#include <bits/stdc++.h>
using namespace std;
int read() {
  int x = 0, c = getchar();
  while (!isdigit(c)) c = getchar();
  while (isdigit(c)) x = x * 10 + c - '0', c = getchar();
  return x;
}
#define pb push_back
#define lo1(i,a) for(int i = 1; i <= a; ++i)
vector<int>G[505];
int mat[505], Ans[505], ans, n = read(), m = read(), vis[503], idx;
bool dfs(int u) {
  vis[u] = idx; random_shuffle(G[u].begin(), G[u].end());
  for (auto v : G[u]) {
    int v1 = mat[v]; 
    if (vis[v1] == idx) continue;
    mat[v1] = 0, mat[u] = v, mat[v] = u;
    if (!v1 || dfs(v1)) return 1;
    mat[v1] = v, mat[u] = 0, mat[v] = v1;
  }
  return 0;
}

inline void add(int u, int v) {G[u].pb(v), G[v].pb(u);}

int main() {
  while (m--) add(read(), read());
  lo1(K, 3) {
    lo1(i, n) if (!mat[i]) ++idx, dfs(i);
    int tmp = 0;
    lo1(i, n) tmp += (mat[i] != 0);
    if (tmp > ans) ans = tmp, copy(mat + 1, mat + 1 + n, Ans + 1);
  }
  cout << ans / 2 << '
';
  lo1(i, n) cout << Ans[i] << ' ';
  return 0;
}

以上是关于[UOJ79]一般图最大匹配的主要内容,如果未能解决你的问题,请参考以下文章

UOJ79 一般图最大匹配

UOJ 79 一般图最大匹配 (?带花树开花)

[kuangbin带你飞]专题十 匹配问题 一般图匹配

带花树草解

uoj#80 二分图最大权匹配

UOJ#80. 二分图最大权匹配 模板