rt,是写丑了吗
/*模板:有源汇上下界最大流*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int maxn = 2e5 + 10;
#define INF 1e8
struct E{
int u,v,l,r;
}e[maxn*2];
int read(){
char c = getchar();
int x = 0;
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - 48,c = getchar();
return x;
}
int cnt = 0,ecnt;
struct Edge{
int nxt,point,flow;
}edge[maxn*2];
int head[10010],tot;
void add(int x,int y,int flow){
edge[++tot].nxt = head[x];edge[tot].point = y;edge[tot].flow = flow;head[x] = tot;
edge[++tot].nxt = head[y];edge[tot].point = x;edge[tot].flow = 0; head[y] = tot;
}
int n,m;
int s,t,S,T;
int G[maxn];
int w[10010];
int Dep[maxn];
int cur[maxn];
int q[maxn];
bool bfs(int S,int T){
for(int i = 1; i <= cnt; ++i)
Dep[i] = 0,cur[i] = head[i];
int l = 1,r = 0;
q[++r] = S;
Dep[S] = 1;
while(l <= r){
int x = q[l++];
for(int i = head[x]; i ; i = edge[i].nxt){
int y = edge[i].point;
if(edge[i].flow && !Dep[y]){
Dep[y] = Dep[x] + 1;
q[++r] = y;
}
}
}
return (Dep[T] != 0);
}
int Dinic(int x,int flow,int T){
if(x == T || !flow) return flow;
int rest = flow,k;
for(int i = cur[x]; i ; i = edge[i].nxt){
int y = edge[i].point;
cur[x] = i;
if(edge[i].flow && Dep[y] == Dep[x] + 1){
k = Dinic(y,min(edge[i].flow,rest),T);
if(!k) Dep[y] = 0;
rest -= k;
edge[i].flow -= k;
edge[i^1].flow += k;
}
}
return flow - rest;
}
void work(){
memset(w,0,sizeof(w));
for(int i = 1; i <= ecnt; ++i){
int d = e[i].r - e[i].l;
int u = e[i].u,v = e[i].v;
add(u,v,d);
w[u] -= e[i].l,w[v] += e[i].l;
}
S = ++cnt,T = ++cnt;
int sum = 0,mxflow = 0;
add(t,s,INF);
int ver = tot;
for(int i = 1; i <= cnt; ++i){
if(w[i] < 0) add(i,T,-w[i]);
else if(w[i] > 0) add(S,i,w[i]),sum += w[i];
}
while(bfs(S,T)){
mxflow += Dinic(S,INF,T);
}
if(mxflow != sum){
printf("%d\n",-1);
puts("");
return;
}
edge[ver].flow = 0,edge[ver].nxt = 0,edge[ver].point = 0;
edge[ver^1].flow = 0,edge[ver^1].nxt = 0,edge[ver^1].point = 0;
mxflow = 0;
while(bfs(s,t)) mxflow += Dinic(s,INF,t);
printf("%d\n",mxflow);
puts("");
}
int main()
{
while(cin >> n >> m){
memset(head,0,sizeof(head));
s = 0,t = 0,S = 0,T = 0,cnt = 0,ecnt = 0,tot = 1;
s = ++cnt,t = ++cnt;
for(int i = 1; i <= m; ++i){
int x = read();G[i] = ++cnt;
e[++ecnt].u = G[i],e[ecnt].v = t,e[ecnt].l = x,e[ecnt].r = INF;
}
for(int i = 1; i <= n; ++i){
int c = read(),d = read();
int day = ++cnt;
e[++ecnt].u = s,e[ecnt].v = day,e[ecnt].l = 0,e[ecnt].r = d;
for(int j = 1; j <= c; ++j){
int id = read() + 1,l = read(),r = read();
e[++ecnt].u = day,e[ecnt].v = G[id],e[ecnt].l = l,e[ecnt].r = r;
}
}
work();
}
return 0;
}