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 }