#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef long long LL;
inline int read()
{
int x=0;bool f=0;char c=getchar();
for (;c<'0'||c>'9';c=getchar()) f=c=='-'?1:0;
for (;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';
return f?-x:x;
}
#define id(a,b) (((a)*m)+(b)+1)
const int N=610,M=3600010,oo=0x3f3f3f3f;
int n,m,sc[N],du[N],stk[N],st=0,ans=0,S,T,dis[N],
ll=1,to[M],next[M],fl[M],head[N],cur[N];
inline void adde(int u,int v,int w)
{
to[++ll]=v;next[ll]=head[u];head[u]=ll;fl[ll]=w;
to[++ll]=u;next[ll]=head[v];head[v]=ll;fl[ll]=0;
}
inline bool bfs()
{
static int qu[N];int l=0,r=1;
memset(dis,0,sizeof dis);
dis[S]=1;qu[0]=S;
while (l!=r)
{
int u=qu[l++];
if (u==T) return 1;
for (int i=head[u],v;i;i=next[i]) if (fl[i])
if (!dis[v=to[i]]) dis[v]=dis[u]+1,qu[r++]=v;
}
return 0;
}
int dfs(int u,int f)
{
if (u==T) return f;
int used=0,tmp;
for (int i=cur[u],v;i;i=next[i])
if (fl[i]&&(dis[v=to[i]]==dis[u]+1)&&(tmp=dfs(v,min(fl[i],f-used))))
{
fl[i]-=tmp;fl[i^1]+=tmp;
used+=tmp;
if (fl[i]) cur[u]=i;
if (used==f) return f;
}
if (!used) dis[u]=0;
return used;
}
int main()
{
n=read();m=read();
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
{
sc[id(i,j)]=read();
for (int k=read(),x,y;k--;)
{
x=read(),y=read();
for (int l=0;l<=y;l++)
adde(id(x,l),id(i,j),oo),du[id(x,l)]++;
}
}
for (int i=0;i<n;i++)
for (int j=1;j<m;j++)
adde(id(i,j-1),id(i,j),oo),du[id(i,j-1)]++;
for (int i=1;i<=n*m;i++) if (!du[i]) stk[++st]=i;
while (st)
{
int u=stk[st--];
for (int i=head[u],v;i;i=next[i]) if (!fl[i])
if (!--du[v=to[i]]) stk[++st]=v;
}
for (int i=2;i<=ll;i++)
if (du[to[i]]||du[to[i^1]]) fl[i]=0;
S=n*m+1;T=S+1;
for (int i=1;i<=n*m;i++) if (!du[i])
{
if (sc[i]>0) ans+=sc[i],adde(S,i,sc[i]);
else adde(i,T,-sc[i]);
}
while (bfs())
{
memcpy(cur,head,sizeof head);
ans-=dfs(S,oo);
}
printf("%d\n",ans);
return 0;
}
bzoj1565
最新推荐文章于 2019-07-30 16:11:54 发布