90°,爆零了QAQ
代码可能有亿点点丑QAQ
萌新需要大佬的帮助OμO
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#define inlind inline void
#define inlinl inline bool
#define inlint inline int
#define inlinc inline char
#define inlins inline string
#define mem0(a) memset(a,0,sizeof(a))
#define memf(a) memset(a,0x3f,sizeof(a))
#define mem_f(a) memset(a,0x80,sizeof(a))
#define mem_1(a) memset(a,-1,sizeof(a))
#define pb(a,b) a.push_back(b)
#define mp(a,b) make_pair(a,b)
#define p1(x) x.first
#define p2(x) x.second
#define lc(x) sgt[x].ls
#define rc(x) sgt[x].rs
#define int long long
using namespace std;
inlind re(int &x) {
x=0;
bool f=0;
int w=getchar();
while(w<'0'||w>'9'){if(w=='-')f = 1;w=getchar();}
while(w<='9'&&w>='0')x=(x<<3)+(x<<1)+w-'0',w=getchar();
if(f)x=-x;
}
inlind re(int &x1,int &x2) {
re(x1);
re(x2);
}
inlind re(int &x1,int &x2,int &x3) {
re(x1);
re(x2);
re(x3);
}
inlind re(int &x1,int &x2,int &x3,int &x4) {
re(x1);
re(x2);
re(x3);
re(x4);
}
inlind wr(int x) {
if(x<0)putchar('-'),x=-x;
if(x>9)wr(x/10);
putchar(x%10+'0');
}
struct edge{int v,wl,w;bool f;};
vector<edge>g[23000];
vector<int>to[23000];
int s,t,ss,tt;
int d[23000];
inlinl bfs(int s,int t){
mem_1(d);
d[s]=0;
queue<int>q;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
int k=g[u].size();
for(int i=0,v=g[u][i].v,w=g[u][i].w;i<k;i++)
if(d[v]==-1&&w)q.push(v),d[v]=d[u]+1;
}
return d[t]!=-1;
}
inlint dfs(int id,int si,int t){
int res=0;
if(id==t)return si;
int k=g[id].size();
for(int i=0;i<k;i++){
int v=g[id][i].v,w=g[id][i].w;
if(w&&d[v]==d[id]+1){
int tmp=dfs(v,min(si,w),t);
g[id][i].w-=tmp;
si-=tmp;
res+=tmp;
g[v][to[id][i]].w+=tmp;
if(si==0) break;
}
}
if(res==0)d[id]=-1;
return res;
}
int n,m;
const int inf=99999999999999ll;
inlint dinic(int s,int t){
int res=0;
while(bfs(s,t)){
res+=dfs(s,99999999999999ll,t);}
return res;
}
inlind ins(int u,int v,int wl,int w){
pb(to[u],g[v].size());
pb(to[v],g[u].size());
g[u].push_back({v,wl,w,0});
g[v].push_back({u,0,0,1});
}
int M[10003];
signed main(){
while(cin>>n>>m){
if(n==0||m==0) return 0;
int cnt =n+m;
s=0;
t=++cnt;
for(int i=1,gt;i<=m;i++)cin>>gt,ins(n+i,t,inf,gt);
for(int i=1;i<=n;i++){
int c,d;
cin>>c>>d;
ins(s,i,0,d);
for(int j=1;j<=c;j++){
int p,l,r;
cin>>p>>l>>r;
p++;
ins(i,n+p,l,r);
}
}
ins(t,s,0,inf);
ss=++cnt;
tt=++cnt;
for(int i=1;i<=cnt-2;i++){
int k=g[i].size();
for(int j=0;j<k;j++){
M[i]-=g[i][j].wl;
M[g[i][j].v]-=g[i][j].wl;
}
}
int sum=0;
for(int i=1;i<=cnt-2;i++){
if(M[i]<0)
ins(i,tt,0,-M[i]);
if(M[i]>0)ins(ss,i,0,M[i]),sum+=M[i];
}
int ans=dinic(ss,tt);
if(ans!=sum){
cout<<-1<<endl<<endl;
for(int i=1;i<=cnt;i++)g[i].clear(),to[i].clear();
continue; }
ans=inf-g[t][g[t].size()-1].w;
for(int i=1;i<=cnt-2;i++){
int k=g[i].size();
for(int j=0;j<k;j++){
g[i][j].w-=ans;
}
}
cout<<dinic(s,t)<<endl<<endl;
for(int i=1;i<=cnt;i++)g[i].clear(),to[i].clear();
}
return 0;
}