看成猪在人手上流动, 源点向第一个有每个猪圈钥匙的人连猪圈里的猪的边,每个人向,对于他有的每把钥匙,下一个有这把钥匙的人连inf的边,每个人向汇点连能买的猪的边。
一直秒T调了半天发现读入T了,把n写成m了。。。
1 //Achen
2 #include<algorithm>
3 #include<iostream>
4 #include<cstring>
5 #include<cstdlib>
6 #include<vector>
7 #include<cstdio>
8 #include<queue>
9 #include<cmath>
10 #include<set>
11 #include<map>
12 #define Formylove return 0
13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
15 const int N=400007;
16 typedef long long LL;
17 typedef double db;
18 using namespace std;
19 int n,m,a[N];
20 int lasthave[N];
21
22 template<typename T>void read(T &x) {
23 char ch=getchar(); x=0; T f=1;
24 while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
25 if(ch=='-') f=-1,ch=getchar();
26 for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
27 }
28
29 struct edge {
30 int u,v,cap,fl,nx;
31 edge(){}
32 edge(int u,int v,int cap,int fl,int nx):u(u),v(v),cap(cap),fl(fl),nx(nx){}
33 }e[N];
34
35 int ecnt=1,fir[N];
36 void add(int u,int v,int cap) {
37 e[++ecnt]=edge(u,v,cap,0,fir[u]); fir[u]=ecnt;
38 //printf("%d->%d:%d
",u,v,cap);
39 e[++ecnt]=edge(v,u,0,0,fir[v]); fir[v]=ecnt;
40 }
41
42 queue<int>que;
43 int d[N];
44 void bfs(int s,int t) {
45 que.push(t);
46 For(i,1,n) d[i]=n;
47 d[t]=0;
48 while(!que.empty()) {
49 int x=que.front();
50 que.pop();
51 for(int i=fir[x];i;i=e[i].nx) {
52 int y=e[i].v;
53 if(d[y]==n&&e[i].cap==0) {
54 d[y]=d[x]+1;
55 que.push(y);
56 }
57 }
58 }
59 }
60
61 #define inf 1e9
62 int p[N];
63 int calc(int s,int t) {
64 int fl=inf;
65 for(int i=t;i!=s;i=e[p[i]].u)
66 fl=min(fl,e[p[i]].cap-e[p[i]].fl);
67 for(int i=t;i!=s;i=e[p[i]].u)
68 e[p[i]].fl+=fl,e[p[i]^1].fl-=fl;
69 return fl;
70 }
71
72 int c[N],cur[N];
73 int isap(int s,int t) {
74 For(i,0,n) c[i]=0;
75 bfs(s,t);
76 For(i,1,n) cur[i]=fir[i],c[d[i]]++;
77 int rs=0;
78 for(int x=s;d[x]<n;) {
79 if(x==t) {
80 rs+=calc(s,t);
81 x=s;
82 }
83 int ok=0;
84 for(int &i=cur[x];i;i=e[i].nx) if(e[i].cap>e[i].fl&&d[e[i].v]+1==d[x]) {
85 ok=1; p[x=e[i].v]=i; break;
86 }
87 if(!ok) {
88 int D=n; cur[x]=fir[x];
89 for(int i=fir[x];i;i=e[i].nx) if(e[i].cap>e[i].fl)
90 D=min(D,d[e[i].v]+1);
91 if(!(--c[d[x]])) break;
92 c[d[x]=D]++;
93 if(x!=s) x=e[p[x]].u;
94 }
95 }
96 return rs;
97 }
98
99 int main() {
100 #ifdef ANS
101 freopen(".in","r",stdin);
102 freopen(".out","w",stdout);
103 #endif
104 read(m); read(n);
105 For(i,1,m) read(a[i]);
106 int s=n+1,t=n+2; n+=2;
107 For(i,1,n-2) {
108 int k,tot,infl=0;
109 read(k);
110 For(j,1,k) {
111 int id;
112 read(id);
113 if(!lasthave[id]) infl+=a[id];
114 else add(lasthave[id],i,inf);
115 lasthave[id]=i;
116 }
117 read(tot);
118 if(infl) add(s,i,infl);
119 add(i,t,tot);
120 }
121 int ans=isap(s,t);
122 printf("%d
",ans);
123 Formylove;
124 }