您的位置:首页 > 其它

bzoj1066 —— [SCOI2007]蜥蜴

2015-10-04 09:47 453 查看
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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: