比赛 20160418x 评测结果 WWWWWTTTTE
题目名称 wifi 最终得分 0
用户昵称 Satoshi 运行时间 9.697 s
代码语言 C++ 内存使用 0.53 MiB
提交时间 2016-04-18 17:32:23
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#define N 100210
using namespace std;
ifstream in("wifi.in");
ofstream out("wifi.out");
int INF=(1<<28);
int n,m;
int S,T,O;
int ac,bc;
int val[65][65]={0};
class edge
{
public:
	int u,v,w,cap,flow;
	void make(int a,int b,int c,int d,int e)
	{
		u=a;
		v=b;
		w=c;
		cap=d;
		flow=e;
	}
	void print()
	{
		out<<u<<' '<<v<<' '<<w<<' '<<cap<<' '<<flow<<endl;
	}
};
class Dinic
{
public:
	vector<edge> E;
	vector<int> G[N];
	bool vis[N];
	int cur[N],h[N];
	int flows,size;
	void clear(int siz)
	{
		size=siz+1;
		flows=0;
		memset(vis,0,sizeof(vis));
		memset(cur,0,sizeof(cur));
		memset(h,0,sizeof(h));
		for(int i=0;i<=size;i++)G[i].clear();
		E.clear();
	}
	void add(int u,int v,int cap)
	{
		edge e;
		e.make(u,v,0,cap,0);
		//e.print();
		E.push_back(e);
		e.make(v,u,0,0,0);
		E.push_back(e);
		int o=E.size();
		G[u].push_back(o-2);
		G[v].push_back(o-1);
	}
	bool DinicBFS(int s,int t)
	{
		int i,u,v;
		queue<int> q;
		memset(vis,0,sizeof(vis));
		memset(h,0,sizeof(h));
		vis[s]=1;
		q.push(s);
		while(!q.empty())
		{
		    u=q.front();
			q.pop();
			for(i=0;i<G[u].size();i++)
			{
				edge e=E[G[u][i]];
				v=e.v;
				if(!vis[v]&&e.cap>e.flow)
				{
					vis[v]=1;
					h[v]=h[u]+1;
					q.push(v);
				}
			}
		}
		return vis[t];
	}
	int DinicDFS(int u,int a,int t)
	{
		if(u==t||a<=0)return a;
		int flow=0,d,v;
		for(int &i=cur[u];i<G[u].size();i++)
		{
			edge e=E[G[u][i]];
			v=e.v;
			if(h[v]==h[u]+1&&e.cap>e.flow)
			{
				d=DinicDFS(v,min(a,e.cap-e.flow),t);
				E[G[u][i]].flow+=d;
				E[G[u][i]^1].flow-=d;
				flow+=d;
				a-=d;
			}
			if(a<=0)break;
		}
        return flow;
	}
	int maxflow(int s,int t)
	{
		int flow=0,temp;
		while(DinicBFS(s,t))
		{
			memset(cur,0,sizeof(cur));
			temp=DinicDFS(s,INF,t);
			flow+=temp;
		}
		flows=flow;
		return flow;
	}
}A;
inline int hash(int x,int y)
{
	return (x-1)*m+y;
}
void read()
{
	int i,j,x;
	in>>n>>m>>ac>>bc;
	S=0;O=n*m;T=O+ac+bc+5;A.clear(T);
	for(i=1;i<=n;i++)for(j=1;j<=m;j++)in>>val[i][j];
}
void work()
{
	int i,j,k,x1,y1,x2,y2,z,cnt=O;
	for(k=1;k<=ac;k++)
	{
		in>>x1>>y1>>x2>>y2>>z;
		cnt++;A.add(S,cnt,z);
		for(i=x1;i<=x2;i++)for(j=y1;j<=y2;j++)A.add(cnt,hash(i,j),val[i][j]);
	}
	for(k=1;k<=bc;k++)
	{
		in>>x1>>y1>>x2>>y2>>z;
		cnt++;
		A.add(cnt,T,z);
		for(i=x1;i<=x2;i++)for(j=y1;j<=y2;j++)A.add(hash(i,j),cnt,val[i][j]);
	}
	int ans=0;
	ans=A.maxflow(S,T);
	out<<ans<<endl;
}
int main()
{
	read();
	work();
	return 0;
}