1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include<bits/stdc++.h> using namespace std; const int N=1e5+5; int n,m,s,t,d[N],cur[N],cnt; long long sum; vector<pair<int,long long> > e; vector<int> G[N]; void init() { e.clear(); for(int i=1;i<=n;i++) G[i].clear(); } void addedge(int u,int v,long long w) { e.push_back(make_pair(v,w)); e.push_back(make_pair(u,0)); G[u].push_back(e.size()-2); G[v].push_back(e.size()-1); } bool bfs() { for(int i=1;i<=n;i++) d[i]=0; queue<int> q; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); for(auto x:G[u]) { int &v=e[x].first; long long &w=e[x].second; if(v==s||d[v]||w<=0) continue; d[v]=d[u]+1; q.push(v); } } if(d[t]) return true; return false; } long long dfs(int u,long long a) { if(u==t) return a; long long f,flow=0; for(int &i=cur[u];i<G[u].size();i++) { int &v=e[G[u][i]].first; long long &w=e[G[u][i]].second; if(d[v]!=d[u]+1||w<=0||(f=dfs(v,min(a,w)))<=0) continue; w-=f; e[G[u][i]^1].second+=f; a-=f; flow+=f; if(a==0) break; } return flow; } long long dinic() { long long flow=0; while(bfs()) { for(int i=1;i<=n;i++) cur[i]=0; flow+=dfs(s,0x7fffffff); } return flow; } int main() { scanf("%d",&n); s=n+1,t=n+2; for(int i=1;i<=n;i++) { long long w; scanf("%lld",&w); addedge(s,i,w); sum+=w; } for(int i=1;i<=n;i++) { long long w; scanf("%lld",&w); addedge(i,t,w); sum+=w; } scanf("%d",&m); for(int i=1;i<=m;i++) { int k; long long w1,w2; scanf("%d%lld%lld",&k,&w1,&w2); addedge(s,t+cnt+1,w1); addedge(t+cnt+2,t,w2); for(int i=1;i<=k;i++) { int x; scanf("%d",&x); addedge(t+cnt+1,x,0x7fffffff); addedge(x,t+cnt+2,0x7fffffff); } cnt+=2; sum+=w1+w2; } n+=2+cnt; printf("%lld\n",sum-dinic()); return 0; }
|