题目描述:
qwq
题目分析:
同 BZOJ 3894 文理分科
题目链接:
Ac 代码:
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#define inf 0x7fffffff
const int maxm=2e6+100;
int head[maxm],to[maxm<<1],net[maxm<<1],cap[maxm<<1];
int cnt=1;
int n,k;
inline void addedge(int u,int v,int c)
{
cnt++;
to[cnt]=v,cap[cnt]=c,net[cnt]=head[u],head[u]=cnt;
cnt++;
to[cnt]=u,cap[cnt]=0,net[cnt]=head[v],head[v]=cnt;
}
namespace Maxflow{
int deep[maxm];
std::queue <int> dl;
inline bool BFS(int s,int t)
{
memset(deep,-1,sizeof(deep));
deep[s]=0;
dl.push(s);
while(!dl.empty())
{
int now=dl.front();
dl.pop();
for(int i=head[now];i;i=net[i])
if(cap[i]&&deep[to[i]]==-1)
deep[to[i]]=deep[now]+1,dl.push(to[i]);
}
return deep[t]!=-1;
}
int DFS(int now,int flow,int t)
{
if(now==t) return flow;
int used=0,w;
for(int i=head[now];i;i=net[i])
if(cap[i]&&deep[to[i]]==deep[now]+1)
{
w=DFS(to[i],std::min(flow-used,cap[i]),t);
used+=w;
cap[i]-=w,cap[i^1]+=w;
if(flow==used) return flow;
}
if(!used) deep[now]=-1;
return used;
}
inline int Dinic(int s,int t)
{
int maxflow=0;
while(BFS(s,t)) maxflow+=DFS(s,inf,t);
return maxflow;
}
}
int main()
{
scanf("%d",&n);
int s=0,t=5000;
int sum=0;
for(int i=1,x;i<=n;i++)
{
scanf("%d",&x);
sum+=x;
addedge(s,i,x);
}
for(int i=1,x;i<=n;i++)
{
scanf("%d",&x);
sum+=x;
addedge(i,t,x);
}
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
int num,a,b;
scanf("%d%d%d",&num,&a,&b);
sum+=(a+b);
addedge(s,n+i,a),addedge(n+k+i,t,b);
for(int j=1;j<=num;j++)
{
int x;
scanf("%d",&x);
addedge(n+i,x,inf);
addedge(x,n+k+i,inf);
}
}
printf("%d\n",sum-Maxflow::Dinic(s,t));
return 0;
}