P8215-[THUPC2022 初赛]分组作业【网络流】


include

include

include

include

define ll long long

using namespace std;
const ll N=51006;
struct node{
ll to,next,w;
}a[N<<4];
ll n,m,s,t,c[N],d[N],e[N],w[N];
ll tot=1,ls[N],dep[N],ans;
queue q;
void addl(ll x,ll y,ll w){
a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;
a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
return;
}
bool bfs(){
while(!q.empty())q.pop();
memset(dep,0,sizeof(dep));
dep[s]=1;q.push(s);
while(!q.empty()){
ll x=q.front();q.pop();
for(ll i=ls[x];i;i=a[i].next){
ll y=a[i].to;
if(!a[i].w||dep[y])continue;
dep[y]=dep[x]+1;
if(yt)return 1;
q.push(y);
}
}
return 0;
}
ll dinic(ll x,ll flow){
ll rest=0,k;
if(x
t)return flow;
for(ll i=ls[x];i;i=a[i].next){
ll y=a[i].to;
if(!a[i].w||dep[y]!=dep[x]+1)continue;
rest+=(k=dinic(y,min(flow-rest,a[i].w)));
a[i].w-=k;a[i^1].w+=k;
if(rest==flow)return flow;
}
if(!rest)dep[x]=0;
return rest;
}
signed main()
{
scanf("%lld%lld",&n,&m);s=3
n+1;t=s+1;
for(ll i=1;i<=2n;i++)
scanf("%lld%lld%lld",&c[i],&d[i],&e[i]);
for(ll i=1,x,y,a,b;i<=m;i++){
scanf("%lld%lld%lld%lld",&x,&y,&a,&b);
ll A=(x+1)/2,B=(y+1)/2;
addl(2
n+B,x,b);
w[A]+=a;d[y]-=a;
addl(2n+A,y,a);
}
for(ll i=1;i<=2
n;i++){
addl(s,i,d[i]+1e14);
addl(i,t,c[i]+1e14);
ll p=(i&1)?(i+1):(i-1);
addl(i,p,e[i]);
}
for(ll i=1;i<=n;i++){
addl(s,2n+i,w[i]);
addl(2
n+i,2i-1,1e18);
addl(2
n+i,2i,1e18);
}
while(bfs())
ans+=dinic(s,1e18);
printf("%lld\n",ans-200000000000000ll
n);
return 0;
}