2015年11月23日
网络流24题<1> COGS 14
二分图匹配。
Dinic:
1 #include <bits/stdc++.h> 2 #define rep(i, a, b) for (int i = a; i <= b; i++) 3 #define drep(i, a, b) for (int i = a; i >= b; i--) 4 #define REP(i, a, b) for (int i = a; i < b; i++) 5 #define pb push_back 6 #define mp make_pair 7 #define clr(x) memset(x, 0, sizeof(x)) 8 #define xx first 9 #define yy second 10 using namespace std; 11 typedef long long i64; 12 typedef pair<int, int> pii; 13 const int inf = ~0U>>1; 14 const i64 INF = ~0ULL>>1; 15 //*************************** 16 17 const int maxn = 105; 18 struct Ed { 19 int u, v, nx, c; Ed() {} 20 Ed(int _u, int _v, int _nx, int _c) : 21 u(_u), v(_v), nx(_nx), c(_c) {} 22 } E[3005]; 23 int G[105], cnt; 24 void addedge(int x, int y, int v) { 25 E[cnt] = Ed(x, y, G[x], v); 26 G[x] = cnt++; 27 E[cnt] = Ed(y, x, G[y], 0); 28 G[y] = cnt++; 29 } 30 31 int s, t; 32 33 int level[maxn]; 34 bool bfs() { 35 static int que[maxn]; int qt(0), qh(0); 36 clr(level); 37 level[que[++qt] = s] = 1; 38 while (qt != qh) { 39 int x = que[++qh]; 40 for (int i = G[x]; i != -1; i = E[i].nx) if (E[i].c && !level[E[i].v]) 41 level[que[++qt] = E[i].v] = level[x] + 1; 42 } 43 return !!level[t]; 44 } 45 int dfs(int u, int rm) { 46 if (u == t) return rm; 47 int rm1 = rm; 48 for (int i = G[u]; i != -1; i = E[i].nx) { 49 if (E[i].c && level[E[i].v] == level[u] + 1) { 50 int flow = dfs(E[i].v, min(E[i].c, rm)); 51 E[i].c -= flow, E[i ^ 1].c += flow; 52 if ((rm -= flow) == 0) break; 53 } 54 } 55 if (rm1 == rm) level[u] = 0; 56 return rm1 - rm; 57 } 58 59 int main() { 60 freopen("flyer.in", "r", stdin); 61 freopen("flyer.out", "w", stdout); 62 int n, n1; 63 while (~scanf("%d%d", &n, &n1)) { 64 s = 0, t = n + 1; 65 memset(G, -1, sizeof(G)); 66 int x, y; 67 while (~scanf("%d%d", &x, &y)) addedge(x, y, 1); 68 rep(i, 1, n1) addedge(s, i, 1); 69 rep(i, n1 + 1, n) addedge(i, t, 1); 70 int ans(0); 71 while (bfs()) ans += dfs(s, 0x3f3f3f3f); 72 printf("%d\n", ans); 73 } 74 fclose(stdin); 75 fclose(stdout); 76 return 0; 77 }