BZOJ 1391 [CEOI] Order - 网络流 最大流

Solution

非常简单的建边!!!

但是刚开始的代码不够体现社会主义的优越性, 于是我 ....

惨痛教训啊。。。 终于到了今天才能够体现社会主义优越性。。。

Code

  1 #include<cstring>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<queue>
  5 #define rd read()
  6 #define R register
  7 #define rep(i,a,b) for(register int i = (a); i <= (b); ++i)
  8 #define per(i,a,b) for(register int i = (a); i >= (b); --i)
  9 #define ll long long
 10 using namespace std;
 11 
 12 const int N = 1e6 + 1e5, M = 4e3;
 13 const int inf = ~0U >> 2;
 14 int n, m, head[M], tot, cur[M];
 15 int dep[M], S, T;
 16 int sum, ans;
 17 
 18 queue<int> q;
 19 
 20 struct edge {
 21     int nxt, to, val;
 22 }e[N * 3];
 23 
 24 inline int read() {
 25     int X = 0, p = 1; char c = getchar();
 26     for(; c > '9' || c < '0'; c = getchar()) if(c == '-') p = -1;
 27     for(; c >= '0' && c <= '9'; c = getchar()) X = X * 10 + c - '0';
 28     return X * p;
 29 }
 30 
 31 inline void added(int u, int v, int val) {
 32     e[++tot].to = v;
 33     e[tot].val = val;
 34     e[tot].nxt = head[u];
 35     head[u] = tot;
 36 }
 37 
 38 inline void add(int u, int v, int val) {
 39     added(u, v, val); added(v, u, 0);
 40 }
 41 
 42 int ch(int x) {
 43     return ((x + 1) ^ 1) - 1;
 44 }
 45 
 46 int bfs() {
 47     rep(i, S, T) dep[i] = 0;
 48     dep[S] = 1;
 49     q.push(S);
 50     for(R int u; !q.empty();) {
 51         u = q.front(); q.pop();
 52         for(R int i = head[u]; i; i = e[i].nxt) {
 53             R int nt = e[i].to;
 54             if(!dep[nt] && e[i].val) {
 55                 dep[nt] = dep[u] + 1;
 56                 q.push(nt);
 57             }
 58         }
 59     }
 60     return dep[T];
 61 }
 62 
 63 inline int minn(int A, int B) {
 64     return A > B ? B : A;
 65 }
 66 
 67 int dfs(R int u, R int flow) {
 68     if(u == T || !flow) return flow;
 69     if(!flow) return 0;
 70     R int re = 0;
 71     for(R int i = cur[u]; i && flow; i = e[i].nxt, cur[u] = i) {
 72         R int nt = e[i].to;
 73         if(dep[nt] != dep[u] + 1 || !e[i].val) continue;
 74         R int tmp = dfs(nt, minn(flow, e[i].val));
 75         if(!tmp) continue;
 76         re += tmp;
 77         flow -= tmp;
 78         e[i].val -= tmp;
 79         e[i ^ 1].val += tmp;
 80         if(!flow) return re;
 81     }
 82     return re;
 83 }
 84 
 85 int main()
 86 {
 87     n = rd; m = rd;
 88     T = n + m + 1;
 89     tot = 1;
 90     rep(i, 1, n) {
 91         R int cost = rd;
 92         add(S, i, cost);
 93         sum += cost;
 94         int cnt = rd;
 95         rep(j, 1, cnt) {
 96             int x = rd, v = rd;
 97             add(i, n + x, v);
 98         }
 99     }
100     rep(i, 1, m) {
101         R int x = rd;
102         add(i + n, T, x);
103     }
104     for(; bfs();) {
105         memcpy(cur, head, sizeof(head));
106         ans += dfs(S, inf);
107     }
108     printf("%d\n", sum - ans);
109 }
View Code

猜你喜欢

转载自www.cnblogs.com/cychester/p/9637431.html