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 }
View Code

相关文章:

猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-09-08
  • 2021-05-22
相关资源
相似解决方案