http://www.lydsy.com/JudgeOnline/problem.php?id=1066
isap模板题
神tmwa了两次...
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
queue<int>q;
int dis[1000];
int gap[1000];
struct edge {
int v,f,next;
}e[100000];
int cnt = -1;
int head[1000];
int a[25][25];
int r,c,d,n,en,ans,tot;
int cal (int i,int j) {
return (i - 1) * c + j;
}
void adde (int u,int v,int f) {
e[++cnt].v = v;
e[cnt].f = f;
e[cnt].next = head[u];
head[u] = cnt;
e[++cnt].v = u;
e[cnt].f = 0;
e[cnt].next = head[v];
head[v] = cnt;
}
void bfs () {
gap[0] = 1;
q.push(en);
while(!q.empty()) {
int u = q.front();
q.pop();
for(int i = head[u];i != -1;i = e[i].next) {
int v = e[i].v;
if(!e[i ^ 1].f) continue;
if(dis[v]) continue;
dis[v] = dis[u] + 1;
++gap[dis[v]];
q.push(v);
}
}
}
int dfs (int u,int minf) {
if(u == en)
return minf;
int chan = en;
int Left = minf;
int res;
for(int i = head[u];i != -1;i = e[i].next) {
int v = e[i].v;
if(e[i].f > 0 ) {
if(dis[v] == dis[u] - 1) {
res = dfs(v,min(Left,e[i].f));
e[i].f -= res;
e[i ^ 1].f += res;
Left -= res;
if(dis[0] == 0x3f3f3f3f)
return minf - Left;
if(Left == 0)
break;
}
if(dis[v])
chan = min(chan,dis[v]);
}
}
if(Left == minf) {
--gap[dis[u]];
if(gap[dis[u]] == 0) {
dis[0] = 0x3f3f3f3f;
return minf - Left;
}
dis[u] = chan + 1;
++gap[dis[u]];
}
return minf - Left;
}
void isap () {
bfs();
while(dis[0] < 0x3f3f3f3f) {
ans += dfs(0,0x3f3f3f3f);
}
}
int main () {
memset(head,-1,sizeof head);
scanf("%d%d%d",&r,&c,&d);
n = r * c;
en = 2 * n + 1;
for(int i = 1;i <= r;++i)
for(int j = 1;j <= c;++j)
scanf("%1d",&a[i][j]);
char C = getchar();
for(int i = 1;i <= r;++i) {
for(int j = 1;j <= c;++j) {
C = getchar();
if(C == 'L') {
adde(0,cal(i,j),1);
++tot;
}
}
C = getchar();
}
for(int i = 1;i <= r;++i) {
for(int j = 1;j <= c;++j) {
if(a[i][j] == 0) continue;
for(int k = 1;k <= r;++k)
for(int l = 1;l <= c;++l) {
if(i == k && j == l)
continue;
if((i - k) * (i - k) + (j - l) * (j - l) <= d * d)
if(a[k][l] != 0)
adde(cal(i,j) + n,cal(k,l),0x3f3f3f3f);
}
}
}
for(int i = 1;i <= r;++i)
for(int j = 1;j <= c;++j)
if(a[i][j])
adde(cal(i,j),cal(i,j) + n,a[i][j]);
for(int i = 1;i <= r;++i)
for(int j = 1;j <= c;++j) {
if(a[i][j])
if(i <= d || j <= d || r - i < d || c - j < d) {
adde(cal(i,j) + n,en,0x3f3f3f3f);
}
}
isap();
printf("%d\n",tot - ans);
}