hdu2063 过山车
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int maxn = 2005, inf = 0x3f3f3f;
4 struct Edge {
5 int from, to, cap, flow;
6 };
7
8 struct Dinic {
9 int n, m, s, t;
10 vector<Edge> edges;
11 vector<int> G[maxn];
12 bool vis[maxn];
13 int d[maxn];
14 int cur[maxn];
15
16 void init(int n) {
17 this->n = n;
18 for (int i = 1; i <= n; ++i) {
19 G[i].clear();
20 }
21 edges.clear();
22 }
23 void AddEdge(int from, int to, int cap) {
24 edges.push_back((Edge){from, to, cap, 0});
25 edges.push_back((Edge){to, from, 0, 0});
26 m = edges.size();
27 G[from].push_back(m-2);
28 G[to].push_back(m-1);
29 }
30 bool bfs() {
31 memset(vis, 0, sizeof(vis));
32 queue<int> que;
33 que.push(s);
34 d[s] = 0;
35 vis[s] = true;
36 while (!que.empty()) {
37 int x = que.front(); que.pop();
38 for (int i = 0; i < G[x].size(); ++i) {
39 Edge& e = edges[G[x][i]];
40 if (!vis[e.to] && e.cap > e.flow) {
41 vis[e.to] = true;
42 d[e.to] = d[x] + 1;
43 que.push(e.to);
44 }
45 }
46 }
47 return vis[t];
48 }
49 int dfs(int x, int a) {
50 if (x == t || a == 0) return a;
51 int flow = 0, f;
52 for (int& i = cur[x]; i < G[x].size(); ++i) {
53 Edge& e = edges[G[x][i]];
54 if (d[x] + 1 == d[e.to] && (f = dfs(e.to, min(a, e.cap-e.flow))) > 0) {
55 e.flow += f;
56 edges[G[x][i]^1].flow -= f;
57 flow += f;
58 a -= f;
59 if (a == 0) break;
60 }
61 }
62 return flow;
63 }
64 int maxflow(int s, int t) {
65 this->s = s; this->t = t;
66 int flow = 0;
67 while (bfs()) {
68 memset(cur,0,sizeof(cur));
69 flow += dfs(s,inf);
70 }
71 return flow;
72 }
73 }dinic;
74 int main() {
75 int e;
76 while (~scanf("%d",&e) && e) {
77 int n, m; scanf("%d%d",&n,&m);
78 dinic.init(n+m+2);
79 int s = n+m+1, t = n+m+2;
80 for (int i = 1; i <= n; ++i) {
81 dinic.AddEdge(s,i,1);
82 }
83 for (int i = 1; i <= m; ++i) {
84 dinic.AddEdge(i+n,t,1);
85 }
86 for (int i = 1; i <= e; ++i) {
87 int u, v; scanf("%d%d",&u,&v);
88 dinic.AddEdge(u,v+n,1);
89 }
90 int ans = dinic.maxflow(s,t);
91 printf("%d\n",ans);
92 }
93 return 0;
94 }