比赛 20160418x 评测结果 AAAAAAAEEE
题目名称 wifi 最终得分 70
用户昵称 Fmuckss 运行时间 5.456 s
代码语言 C++ 内存使用 172.35 MiB
提交时间 2016-04-18 18:00:25
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 3e4;
const int inf = 1e9;

int s, t;
int n, m, a, b;
int ma[65][65];

class solve_max_flow {
private:
	struct edge {
		int to, ne, le;
		edge() {}
		edge(int to_, int ne_, int le_) { to = to_, ne = ne_, le = le_; }
	}e[maxn*(int)5e2];
	int head[maxn], tot;
	int de[maxn];
	int cur[maxn];
public:
	void add_edge(int fr, int to, int v) {
		e[++tot] = edge(to, head[fr], v); head[fr] = tot;
		e[++tot] = edge(fr, head[to], 0); head[to] = tot;
	}
	
	bool bfs() {
		memset(de, 0, sizeof(de));
		queue<int> q;
		q.push(s);
		de[s] = 1;
		while(!q.empty()) {
			int now = q.front(); q.pop(); 
			if(now == t) return true;
			for(int i = head[now]; i; i = e[i].ne) {
				int to = e[i].to;
				if(de[to] || e[i].le <= 0) continue;
				de[to] = de[now] + 1;
				q.push(to);
			}
		}
		return de[t];
	}
	
	int dfs(int now, int min_flow) {
		if(now == t) return min_flow;
		
		for(int &i = cur[now]; i; i = e[i].ne) {
			int to = e[i].to;
			if(de[to] != de[now] + 1 || e[i].le <= 0) continue;
			int now_flow = dfs(to, min(min_flow, e[i].le));
			if(!now_flow) continue;
			e[i].le -= now_flow;
			if(i & 1) e[i+1].le += now_flow;
			else e[i-1].le += now_flow;
			return now_flow;
		}
		return 0; 
	}
	
	int solve() {
		int ans = 0, tmp;
		while(bfs()) {
			memcpy(cur, head, (t+1) << 2);
			while(tmp = dfs(s, inf)) ans += tmp;
		}
		return ans;
	}
	
}smf;

int get_num() {
	int ans = 0;
	char tmp = getchar();
	while(tmp < '0' || tmp > '9') tmp = getchar();
	while(tmp >= '0' && tmp <= '9') {
		ans = 10*ans + tmp - '0';
		tmp = getchar();
	} 
	return ans;
}

int hash[65][65];

void get_hash() {
	int cnt = 0;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			hash[i][j] = ++cnt;
		}
	}
}

void read() {
	n = get_num();
	m = get_num();
	a = get_num();
	b = get_num();
	int p = n*m;
	s = 2*p + a+b + 1;
	t = s + 1;
	get_hash();
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			ma[i][j] = get_num();
			smf.add_edge(hash[i][j], p + hash[i][j], ma[i][j]);
		}
	}
	int x1, x2, y1, y2, c;
	for(int i = 1; i <= a; i++) {
		x1 = get_num();
		y1 = get_num();
		x2 = get_num();
		y2 = get_num();
		c = get_num();
		smf.add_edge(s, i + p*2, c);
		for(int j = x1; j <= x2; j++) {
			for(int k = y1; k <= y2; k++) {
				smf.add_edge(i + p*2, hash[j][k], inf);
			}
		}
	}
	for(int i = 1; i <= b; i++) {
		x1 = get_num();
		y1 = get_num();
		x2 = get_num();
		y2 = get_num();
		c = get_num();
		smf.add_edge(a + i + p*2, t, c);
		for(int j = x1; j <= x2; j++) {
			for(int k = y1; k <= y2; k++) {
				smf.add_edge(p + hash[j][k], a + i + p*2, inf);
			}
		}
	}
}

int main() {
	freopen("wifi.in", "r", stdin);
	freopen("wifi.out", "w", stdout);
	read();
	printf("%d", smf.solve());
	return 0;	
}