#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<map> using namespace std; #define INF 100000000 const int dic[4][2]={{0,-1},{-1,0},{0,1},{1,0}}; int n,m,p,s,t,tot,tot2,x,y,z,nx,ny,level[1000000],iter[1000000],head[1000000],q[1000000]; struct edge{int v,cap,rev,nxt;}E[3000000]; map< pair<int,int>,pair<int,int> >MAP; int getid(int x,int y,int k){ if (MAP.count(make_pair(x,y))){ if (k==1) return MAP[make_pair(x,y)].first; else return MAP[make_pair(x,y)].second; } MAP[make_pair(x,y)]=make_pair(tot2+1,tot2+2); tot2+=2; if (k==1) return MAP[make_pair(x,y)].first; else return MAP[make_pair(x,y)].second; } void add(int x,int y,int k){ E[++tot].v=y; E[tot].cap=k; E[tot].rev=tot+1; E[tot].nxt=head[x]; head[x]=tot; E[++tot].v=x; E[tot].cap=0; E[tot].rev=tot-1; E[tot].nxt=head[y]; head[y]=tot; } void bfs(int s){ memset(level,-1,sizeof level); level[s]=0; int tt=0,ww=1; q[1]=s; while (tt<ww){ tt++; int v=q[tt]; for (int i=head[v];i;i=E[i].nxt){ edge &e=E[i]; if (e.cap>0 && level[e.v]<0){ level[e.v]=level[v]+1; q[++ww]=e.v; } } } } int dfs(int v,int t,int f){ if (v==t) return f; for (int &i=iter[v];i;i=E[i].nxt){ edge &e=E[i]; if (e.cap>0 && level[v]<level[e.v]){ int d=dfs(e.v,t,min(f,e.cap)); if (d>0){ e.cap-=d; E[e.rev].cap+=d; return d; } } } return 0; } int dinic(int s,int t){ int flow=0; for (;;){ bfs(s); if (level[t]<0) break; for (int i=1;i<=p*8;i++) iter[i]=head[i]; int f=0; while ((f=dfs(s,t,INF))>0) flow+=f; } return flow; } inline int col(int x,int y){ if (x%4==1) return 1+y%2; if (x%4==2) return 4-y%2; if (x%4==3) return 3+y%2; if (x%4==0) return 2-y%2; } int main(){ scanf("%d%d%d",&n,&m,&p); s=getid(n,m+1,1); t=getid(n,m+1,2); for (int i=1;i<=p;i++){ scanf("%d%d%d",&x,&y,&z); add(getid(x,y,1),getid(x,y,2),z); if (col(x,y)==1) add(s,getid(x,y,1),INF); if (col(x,y)==4) add(getid(x,y,2),t,INF); for (int k=0;k<=3;k++){ nx=x+dic[k][0]; ny=y+dic[k][1]; if (nx<1 || ny<1 || nx>n || ny>m) continue; if (col(x,y)==1 && col(nx,ny)==2) add(getid(x,y,2),getid(nx,ny,1),INF); if (col(x,y)==2 && col(nx,ny)==3) add(getid(x,y,2),getid(nx,ny,1),INF); if (col(x,y)==3 && col(nx,ny)==4) add(getid(x,y,2),getid(nx,ny,1),INF); } } printf("%d\n",dinic(s,t)); return 0; }
|