【SPOJ-MATCHING】Fast Maximum Matching【二分图匹配】

来源:互联网 发布:python入门经典书籍 编辑:程序博客网 时间:2024/06/08 09:03

dinic TLE,hungary TLE...

然后听说了比hungary不知道高到哪里去的HK算法。


模板...


#include <cstdio>#include <algorithm>using namespace std;typedef long long LL;const int maxn = 50005, maxm = 150005, maxq = 200000, inf = 0x3f3f3f3f;int n, m, head[maxn], cnt, xlink[maxn], ylink[maxn], dx[maxn], dy[maxn], q[maxq];bool vis[maxn];struct _edge {int v, next;} g[maxm];inline int iread() {int f = 1, x = 0; char ch = getchar();for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';return f * x;}inline void add(int u, int v) {g[cnt] = (_edge) {v, head[u]};head[u] = cnt++;}int dis;bool bfs() {int h = 0, t = 0; dis = inf;for(int i = 0; i < maxn; i++) dx[i] = dy[i] = -1;for(int i = 1; i <= n; i++) if(!~xlink[i]) dx[q[t++] = i] = 0;while(h != t) {int u = q[h++];if(dx[u] > dis) break;for(int i = head[u]; ~i; i = g[i].next) if(!~dy[g[i].v]) {dy[g[i].v] = dx[u] + 1;if(!~ylink[g[i].v]) dis = dy[g[i].v];else dx[q[t++] = ylink[g[i].v]] = dy[g[i].v] + 1;}}return dis != inf;}bool find(int x) {for(int i = head[x]; ~i; i = g[i].next) if(!vis[g[i].v] && dy[g[i].v] == dx[x] + 1) {vis[g[i].v] = 1;if(~ylink[g[i].v] && dy[g[i].v] == dis) continue;if(!~ylink[g[i].v] || find(ylink[g[i].v])) {xlink[x] = g[i].v; ylink[g[i].v] = x;return 1;}}return 0;}int main() {n = iread(); m = iread();for(int i = 0; i < maxn; i++) head[i] = xlink[i] = ylink[i] = -1;int k = iread();while(k--) {int x = iread(), y = iread();add(x, y);}int ans = 0;while(bfs()) {for(int i = 0; i < maxn; i++) vis[i] = 0;for(int i = 1; i <= n; i++) if(!~xlink[i]) ans += find(i);}printf("%d\n", ans);return 0;}


0 0
原创粉丝点击