RT
本地 (Ubuntu) 输出 10725,答案为 10782。
输入如下:
10
977 801 279 352 686 161 520 574 303 240
630 883 296 389 27 973 313 501 693 112
10
5 343 182 1 4 10 3 7
1 770 982 8
1 671 986 4
6 618 689 3 2 7 8 9 5
1 24 448 8
3 110 596 6 9 3
1 964 811 5
3 479 890 5 6 10
1 254 216 9
2 141 108 6 1
Code:
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using ull=unsigned long long;
using ld=long double;
using pii=pair<int,int>;
#define fi first
#define se second
constexpr int INF=0x3f3f3f3f;
int n,m,s=10001,t=10002;
struct enode {
int nxt,to,val;
} edge[1000005];
int tot=1,head[10005];
void add(int u,int v,int w) {
edge[++tot]={head[u],v,w};
head[u]=tot;
}
int dep[10005],now[10005];
bool bfs() {
for(int i=1;i<=n+m;i++) dep[i]=INF;
dep[t]=INF;
dep[s]=0,now[s]=head[s];
queue<int> q;q.push(s);
while(!q.empty()) {
int u=q.front();q.pop();
for(int i=head[u];i;i=edge[i].nxt) {
int v=edge[i].to,w=edge[i].val;
if(dep[v]==INF&&w>0) {
dep[v]=dep[u]+1;
now[v]=head[v];
if(v==t) return 1;
q.push(v);
}
}
}
return 0;
}
int dfs(int u,int sum) {
if(u==t) return sum;
int k,flow=0;
for(int i=now[u];i&&sum>0;i=edge[i].nxt) {
now[u]=i;
int v=edge[i].to,w=edge[i].val;
if(dep[v]==dep[u]+1&&w>0) {
k=dfs(v,min(w,sum));
if(k==0) dep[v]=INF;
edge[i].val-=k,edge[i^1].val+=k;
sum-=k,flow+=k;
}
}
return flow;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
int ans=0;
for(int i=1;i<=n;i++) {
int x;cin>>x;
add(s,i,x);add(i,s,0);
ans+=x;
}
for(int i=1;i<=n;i++) {
int x;cin>>x;
add(i,t,x);add(t,i,0);
ans+=x;
}
cin>>m;
for(int i=1;i<=m;i++) {
int k,c1,c2;cin>>k>>c1>>c2;
add(s,n+i,c1);add(n+i,s,0);
add(n+i,t,c2);add(t,n+i,0);
ans+=c1+c2;
for(int j=1;j<=k;j++) {
int x;cin>>x;
add(n+i,x,INF);add(x,n+i,INF);
}
}
while(bfs()) ans-=dfs(s,INF);
cout<<ans<<"\n";
return 0;
}