The data range is pitfall...
The composition method is described in detail here.
Http://apps.hi.baidu.com/share/detail/18295127
Similar to a previous question,
Use the total positive value and minus the minimum cut,
# Include <cstdio> # include <string. h> using namespace STD; typedef long ll; const int n = 3550; const int M = 9000000; const ll INF = 13216546513113211ll; int head [N]; struct edge {int V, next; ll W;} edge [m]; int CNT, S = 0; void addedge (int u, int V, ll W) // a directed edge {edge [CNT] is stored here. V = V; edge [CNT]. W = W; edge [CNT]. next = head [u]; head [u] = CNT ++; edge [CNT]. V = u; edge [CNT]. W = 0; edge [CNT]. next = head [v]; head [v] = CNT ++;} ll SAP (Int t) {int pre [N], cur [N], DIS [N], gap [N]; ll flow = 0, Aug = inf, U; bool flag; for (INT I = 0; I <= T; I ++) {cur [I] = head [I]; Gap [I] = dis [I] = 0 ;} gap [s] = t + 1; u = pre [s] = s; while (DIS [s] <= T) {flag = 0; for (Int & J = cur [u]; ~ J; j = edge [J]. next) {int v = edge [J]. v; If (edge [J]. w> 0 & dis [u] = dis [v] + 1) {flag = 1; if (edge [J]. W <Aug) Aug = edge [J]. w; Pre [v] = u; u = V; If (u = T) {flow + = Aug; // printf ("% d \ n", flow ); while (u! = S) {u = pre [u]; edge [cur [u]. w-= Aug; edge [cur [u] ^ 1]. W + = Aug; // returns or finds the matched edge} Aug = inf;} break;} If (FLAG) continue; int mindis = t + 1; for (Int J = head [u]; ~ J; j = edge [J]. next) {int v = edge [J]. v; If (edge [J]. w> 0 & dis [v] <mindis) {mindis = dis [v]; cur [u] = J ;}} if (-- gap [dis [u]) = 0) break; Gap [dis [u] = mindis + 1] ++; u = pre [u];} return flow;} ll value [N]; void Init () {memset (Head,-1, sizeof (head); CNT = 0;} int main () {int CAS; int N, lay, C; ll a, B; ll sum = 0; int U, V; scanf ("% d", & CAS ); for (INT I = 1; I <= CAS; ++ I) {Init (); sum = 0; scanf ("% d", & lay ); for (INT I = 0; I <lay; ++ I) {scanf ("% d", & N); For (Int J = 0; j <N; ++ J) {scanf ("% i64d % i64d % d", & A, & B, & C ); value [I * 25 + J + 1] = B-A; For (int K = 0; k <C; ++ K) {scanf ("% d ", & U, & V); U --; V --; addedge (I * 25 + J + 1, u * 25 + V + 1, INF );} if (value [I * 25 + J + 1]> 0) addedge (0, I * 25 + J + 1, value [I * 25 + J + 1]), sum + = value [I * 25 + J + 1]; If (value [I * 25 + J + 1] <0) addedge (I * 25 + J +, -value [I x 25 + J + 1]);} ll ans = sum-SAP (2550); // printf ("% d \ n", sum ); printf ("case # % d: % i64d \ n", I, ANS);} return 0 ;}