RT,前三个点T飞,最后一个点没判出来 -1/kk
#include<bits/stdc++.h>
#define N 2001001
#define inf 1000000000
#define MAX 1101
using namespace std;
typedef int ll;
typedef double db;
const ll mod=1000000007;
inline void read(register ll &ret)
{
scanf("%d",&ret);
return;
}
ll n,m,g[N],cnt,head[N],w[N],tot,S,T,dep[N],now[N];
struct _edge
{
ll from,to,l,r;
}ee[N];
struct edge
{
ll from,to,nxt,dis;
}e[N];
inline void add(register ll u,register ll v,register ll d)
{
e[++cnt].from=u;
e[cnt].to=v;
e[cnt].dis=d;
e[cnt].nxt=head[u];
head[u]=cnt;
return;
}
queue<ll>q;
inline bool bfs(register ll s,register ll t)
{
while(!q.empty())
q.pop();
memset(dep,0,(T+5)*sizeof(ll));
q.push(s);
dep[s]=1;
while(!q.empty())
{
register ll ver=q.front();
q.pop();
now[ver]=head[ver];
for(register int i=head[ver];i!=-1;i=e[i].nxt)
{
if(e[i].dis&&!dep[e[i].to])
{
dep[e[i].to]=dep[ver]+1;
q.push(e[i].to);
}
}
}
return dep[t];
}
inline ll dfs(register ll s,register ll t,register ll ver,register ll lim)
{
if(ver==t)
return lim;
register ll out=0;
for(register ll &i=now[ver];i!=-1&&lim;i=e[i].nxt)
{
if(e[i].dis&&dep[e[i].to]==dep[ver]+1)
{
register ll tmp=dfs(s,t,e[i].to,min(lim,e[i].dis));
e[i].dis-=tmp;
e[i^1].dis+=tmp;
lim-=tmp;
out+=tmp;
}
}
if(!out)
dep[ver]=0;
return out;
}
inline ll dinic(register ll s,register ll t)
{
register ll ret=0;
while(bfs(s,t))
ret+=dfs(s,t,s,inf);
return ret;
}
ll s,t;
inline ll solve()
{
for(register int i=1;i<=tot;i++)
{
add(ee[i].from,ee[i].to,ee[i].r-ee[i].l);
add(ee[i].to,ee[i].from,0);
w[ee[i].from]-=ee[i].l;
w[ee[i].to]+=ee[i].l;
}
register ll tmp=0;
for(register int i=s;i<=t;i++)
{
if(w[i]<0)
{
add(i,T,-w[i]);
add(T,i,0);
}
else if(w[i]>0)
{
add(S,i,w[i]);
add(i,S,0);
tmp+=w[i];
}
}
if(dinic(S,T)!=tmp)
return -1;
return dinic(s,t);
}
signed main()
{
while(scanf("%d",&n)!=-1)
{
tot=0;
cnt=-1;
memset(head,-1,sizeof(head));
memset(w,0,sizeof(w));
read(m);
s=0,t=n+m+1;
S=n+m+2,T=n+m+3;
for(register int i=1;i<=m;i++)
{
read(g[i]);
ee[++tot].from=i+n;
ee[tot].to=t;
ee[tot].l=g[i];
ee[tot].r=inf;
}
ee[++tot].from=t;
ee[tot].to=s;
ee[tot].l=0;
ee[tot].r=inf;
for(register int i=1;i<=n;i++)
{
register ll c,d;
read(c);
read(d);
ee[++tot].from=s;
ee[tot].to=i;
ee[tot].l=0;
ee[tot].r=d;
for(register int j=1;j<=c;j++)
{
register ll p,l,r;
read(p);
read(l);
read(r);
p++;
ee[++tot].from=i;
ee[tot].to=n+p;
ee[tot].l=l;
ee[tot].r=r;
}
}
printf("%lld\n",solve());
putchar('\n');
}
exit(0);
}