生活随笔
收集整理的這篇文章主要介紹了
【HDOJ】2732 Leapin' Lizards
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
貪心+網絡流。對于每個結點,構建入點和出點。 對于每一個lizard>0,構建邊s->in position of lizard, 容量為1. 對于pillar>0, 構建邊in position of pillar -> out position of pillar, 容量為number of pillar. 若沿四個方向移動距離d可以超過邊界,則構建邊out position of pillar -> t, 容量為INF; 否則, 對于曼哈頓距離l(l>0 and l<=d)的點p構建邊out position of pillar -> in position p, 容量為INF。(此時,不用考慮p是否含有pillar,無所謂) Dinic可解網絡流。一定要注意輸出was/were,單復數和0等。
1 /* 2732 */
2 #include <iostream>
3 #include <
string >
4 #include <map>
5 #include <queue>
6 #include <
set >
7 #include <stack>
8 #include <vector>
9 #include <deque>
10 #include <algorithm>
11 #include <cstdio>
12 #include <cmath>
13 #include <ctime>
14 #include <cstring>
15 #include <climits>
16 #include <cctype>
17 #include <cassert>
18 #include <functional>
19 #include <iterator>
20 #include <iomanip>
21 using namespace std;
22 // #pragma comment(linker,"/STACK:102400000,1024000")
23
24 #define sti set<int>
25 #define stpii set<pair<int, int> >
26 #define mpii map<int,int>
27 #define vi vector<int>
28 #define pii pair<int,int>
29 #define vpii vector<pair<int,int> >
30 #define rep(i, a, n) for (int i=a;i<n;++i)
31 #define per(i, a, n) for (int i=n-1;i>=a;--i)
32 #define clr clear
33 #define pb push_back
34 #define mp make_pair
35 #define fir first
36 #define sec second
37 #define all(x) (x).begin(),(x).end()
38 #define SZ(x) ((int)(x).size())
39 #define lson l, mid, rt<<1
40 #define rson mid+1, r, rt<<1|1
41
42 const int INF =
0x1f1f1f1f ;
43 const int maxn =
25 ;
44 const int maxv = maxn*maxn*
2 ;
45 const int maxe = maxv*maxn*
8 ;
46 int V[maxe], F[maxe], nxt[maxe];
47 int head[maxv], dis[maxv];
48 char Ps[maxn][maxn], Ls[maxn][maxn];
49 int dir[
4 ][
2 ] =
{
50 -
1 ,
0 ,
1 ,
0 ,
0 , -
1 ,
0 ,
1
51 };
52 int n, m;
53
54 void addEdge(
int u,
int v,
int c) {
55 V[m] =
v;
56 F[m] =
c;
57 nxt[m] =
head[u];
58 head[u] = m++
;
59
60 V[m] =
u;
61 F[m] =
0 ;
62 nxt[m] =
head[v];
63 head[v] = m++
;
64 }
65
66 bool bfs(
int s,
int t) {
67 queue<
int >
Q;
68 int u, v, k;
69
70 memset(dis,
0 ,
sizeof (dis));
71 Q.push(s);
72 dis[s] =
1 ;
73
74 while (!
Q.empty()) {
75 u =
Q.front();
76 Q.pop();
77 for (k=head[u]; k!=-
1 ; k=
nxt[k]) {
78 v =
V[k];
79 if (!dis[v] &&
F[k]) {
80 dis[v] = dis[u] +
1 ;
81 Q.push(v);
82 }
83 }
84 }
85
86 return dis[t]==
0 ;
87 }
88
89 int dfs(
int u,
int t,
int val) {
90 if (u==t || val==
0 )
91 return val;
92
93 int ret =
0 ;
94 int tmp, v, k;
95
96 for (k=head[u]; k!=-
1 ; k=
nxt[k]) {
97 v =
V[k];
98 if (dis[v]==dis[u]+
1 && F[k] && (tmp=dfs(v, t, min(val, F[k])))>
0 ) {
99 F[k] -=
tmp;
100 F[k^
1 ] +=
tmp;
101 ret +=
tmp;
102 val -=
tmp;
103 if (val ==
0 )
104 break ;
105 }
106 }
107
108 return ret;
109 }
110
111 int Dinic(
int s,
int t) {
112 int ret =
0 , tmp;
113
114 while (
1 ) {
115 if (bfs(s, t))
116 break ;
117
118 tmp =
dfs(s, t, INF);
119 ret +=
tmp;
120 }
121
122 return ret;
123 }
124
125 int main() {
126 ios::sync_with_stdio(
false );
127 #ifndef ONLINE_JUDGE
128 freopen(
" data.in " ,
" r " , stdin);
129 freopen(
" data.out " ,
" w " , stdout);
130 #endif
131
132 int case_n;
133 int s, t, n_, m_, d, tmp;
134 int x, y;
135 int k, id, id_;
136 int ans, tot;
137 bool flag;
138
139 scanf(
" %d " , &
case_n);
140 rep(tt,
1 , case_n+
1 ) {
141 scanf(
" %d %d " , &n_, &
d);
142
143 rep(i,
1 , n_+
1 )
144 scanf(
" %s " , Ps[i]+
1 );
145 rep(i,
1 , n_+
1 )
146 scanf(
" %s " , Ls[i]+
1 );
147
148 m_ = strlen(Ps[
1 ]+
1 );
149 tot =
0 ;
150 s = m =
0 ;
151 k = n_ *
m_;
152 t = k*
2 +
1 ;
153 memset(head, -
1 ,
sizeof (head));
154
155 rep(i,
1 , n_+
1 ) {
156 rep(j,
1 , m_+
1 ) {
157 id = (i-
1 ) * m_ +
j;
158 if (Ls[i][j] ==
' L ' ) {
159 addEdge(s, id,
1 );
160 ++
tot;
161 }
162 if (Ps[i][j] >
' 0 ' ) {
163 addEdge(id, id+k, Ps[i][j]-
' 0 ' );
164 flag =
true ;
165 id +=
k;
166 rep(kk,
0 ,
4 ) {
167 x = i + dir[kk][
0 ] *
d;
168 y = j + dir[kk][
1 ] *
d;
169 if (x<=
0 || x>n_ || y<=
0 || y>
m_) {
170 addEdge(id, t, INF);
171 flag =
false ;
172 break ;
173 }
174 }
175 if (flag) {
176 id_ =
0 ;
177 rep(ii,
1 , n_+
1 ) {
178 rep(jj,
1 , m_+
1 ) {
179 ++
id_;
180 tmp = abs(ii-i) + abs(jj-
j);
181 if (tmp>
0 && tmp<=
d)
182 addEdge(id, id_, Ps[i][j]-
' 0 ' );
183 }
184 }
185 }
186 }
187 }
188 }
189
190 ans = tot -
Dinic(s, t);
191 printf(
" Case #%d: " , tt);
192 if (ans ==
0 ) {
193 printf(
" no lizard was left behind.\n " );
194 }
else if (ans ==
1 ) {
195 printf(
" 1 lizard was left behind.\n " );
196 }
else {
197 printf(
" %d lizards were left behind.\n " , ans);
198 }
199 }
200
201 #ifndef ONLINE_JUDGE
202 printf(
" time = %d.\n " , (
int )clock());
203 #endif
204
205 return 0 ;
206 }
?
轉載于:https://www.cnblogs.com/bombe1013/p/4885773.html
總結
以上是生活随笔 為你收集整理的【HDOJ】2732 Leapin' Lizards 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。