P2472 [SCOI2007] 蜥蜴

P2472 [SCOI2007] 蜥蜴

分析

这道题同样也要拆点,每个点最多能经过的蜥蜴数就是它的高度,拆点后中间边的流量设为这个石柱的高度即可。剩下的就枚举两个合法石柱并建边,把源点和有蜥蜴的点相连,容量为 $1$,把能跳出地图的点与汇点相连。

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int m,n,N,d,o,p=1,s1,s2,t[10001],t0[10001],f[10001];
struct str
{
int m,q,r;
}a[1000001];
void road(int x,int y,int r)
{
a[++p].m=y;
a[p].q=t[x];
t[x]=p;
a[p].r=r;
}
bool bfs()
{
queue<int> Q;
Q.push(s1);
for(int i=1;i<=N;++i) f[i]=0;
f[s1]=1;
while(!Q.empty())
{
int k=Q.front();
Q.pop();
for(int i=t[k];i!=0;i=a[i].q)
{
if(f[a[i].m]==0&&a[i].r!=0)
{
f[a[i].m]=f[k]+1;
Q.push(a[i].m);
}
}
}
return f[s2]!=0;
}
int dfs(int x,int r)
{
if(x==s2) return r;
int s=0;
for(int i=t0[x];i!=0;i=a[i].q)
{
t0[x]=i;
if(f[a[i].m]==f[x]+1&&a[i].r!=0)
{
int z=dfs(a[i].m,min(r,a[i].r));
if(z!=0)
{
a[i].r-=z;
a[i^1].r+=z;
r-=z;
s+=z;
}
else f[a[i].m]=0;
if(r==0) return s;
}
}
return s;
}
int main()
{
scanf("%d%d%d",&m,&n,&d);
N=m*n*2+2;
s1=N-1;
s2=N;
for(int i=1;i<=m;++i)
{
scanf("\n");
for(int j=1;j<=n;++j)
{
int r=getchar()-'0';
if(r!=0)
{
int a1=(i-1)*n+j;
road(a1+m*n,a1,r);
road(a1,a1+m*n,0);
}
}
}
for(int i=1;i<=m;++i)
{
scanf("\n");
for(int j=1;j<=n;++j)
{
char z=getchar();
if(z=='L')
{
++o;
int a1=(i-1)*n+j;
road(s1,a1+m*n,1);
road(a1+m*n,s1,0);
}
}
}
for(int i=1;i<=m;++i)
{
for(int j=1;j<=n;++j)
{
if(i<=d||i>=m-d+1||j<=d||j>=n-d+1)
{
int a1=(i-1)*n+j;
road(a1,s2,1e9);
road(s2,a1,0);
}
}
}
for(int i=1;i<=m;++i)
{
for(int j=1;j<=n;++j)
{
int a1=(i-1)*n+j;
for(int k=1;k<=m;++k)
{
for(int l=1;l<=n;++l)
{
int a2=(k-1)*n+l;
if((i-k)*(i-k)+(j-l)*(j-l)<=d*d)
{
road(a1,a2+m*n,1e9);
road(a2+m*n,a1,0);
}
}
}
}
}
int r=0;
while(bfs())
{
for(int i=1;i<=N;++i) t0[i]=t[i];
r+=dfs(s1,1e9);
}
printf("%d",o-r);
return 0;
}