【BZOJ】1066: [SCOI2007]蜥蜴(最大流)

來源:互聯網
上載者:User

標籤:des   blog   os   io   for   資料   ar   div   log   

 

本題想一想應該懂了的。

我們想啊,,每個點都有限制,每個點都可以跳到另一個有限制的點,每個有蜥蜴的點都可以跳到四周的有限制的點,,哈哈,自然會想到網路流。

其中很自然的可以相到,要表示每個點的容量限制,那麼就拆點,一個上,一個下,容量為權值

然後向四周串連也就是某個點的下將距離範圍內的某個點的上串連,容量為oo

源向蜥蜴串連,容量為1

可以跑到邊界外的點的下向匯串連,容量為oo

跑一次最大流,答案就是蜥蜴總數減去最大流。

#include <cstdio>#include <cstring>#include <cmath>#include <string>#include <iostream>#include <algorithm>using namespace std;#define rep(i, n) for(int i=0; i<(n); ++i)#define for1(i,a,n) for(int i=(a);i<=(n);++i)#define for2(i,a,n) for(int i=(a);i<(n);++i)#define for3(i,a,n) for(int i=(a);i>=(n);--i)#define for4(i,a,n) for(int i=(a);i>(n);--i)#define CC(i,a) memset(i,a,sizeof(i))#define read(a) a=getint()#define print(a) printf("%d", a)#define dbg(x) cout << #x << " = " << x << endl#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<‘0‘||c>‘9‘; c=getchar()) if(c==‘-‘) k=-1; for(; c>=‘0‘&&c<=‘9‘; c=getchar()) r=r*10+c-‘0‘; return k*r; }inline const int max(const int &a, const int &b) { return a>b?a:b; }inline const int min(const int &a, const int &b) { return a<b?a:b; }const int N=1000, M=N*5000, oo=~0u>>1;int ihead[N], cnt=1, cur[N], gap[N], d[N], p[N], n, m, g, a[22][22];struct ED { int from, to, cap, next; } e[M];inline const int id(const int &x, const int &y) { return (x-1)*m+y; }inline const bool check(const int &i, const int &j, const int &x, const int &y) { return ((i-x)*(i-x)+(j-y)*(j-y))<=g*g; }inline void add(const int &u, const int &v, const int &w) {e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v; e[cnt].from=u; e[cnt].cap=w;e[++cnt].next=ihead[v]; ihead[v]=cnt; e[cnt].to=u; e[cnt].from=v; e[cnt].cap=0;}int isap(const int &s, const int &t, const int &n) {for1(i, 0, n) cur[i]=ihead[i];int ret=0, i, f, u=s;gap[0]=n;while(d[s]<n) {for(i=cur[u]; i; i=e[i].next) if(e[i].cap && d[u]==d[e[i].to]+1) break;if(i) {p[e[i].to]=cur[u]=i; u=e[i].to;if(u==t) {for(f=oo; u!=s; u=e[p[u]].from) f=min(f, e[p[u]].cap);for(u=t; u!=s; u=e[p[u]].from) e[p[u]].cap-=f, e[p[u]^1].cap+=f;ret+=f;}}else {if(! (--gap[d[u]]) ) break;d[u]=n; cur[u]=ihead[u];for(i=ihead[u]; i; i=e[i].next) if(e[i].cap && d[u]>d[e[i].to]+1) d[u]=d[e[i].to]+1;++gap[d[u]];if(u!=s) u=e[p[u]].from;}}return ret;}int main() {read(n); read(m); read(g);int s=n*m*2+10, t=s+1, now, tp, ans=0; char c;for1(i, 1, n) for1(j, 1, m) {for(c=getchar(); c<‘0‘||c>‘9‘; c=getchar());tp=c-‘0‘;if(tp) {now=id(i, j); a[i][j]=tp;add(now, now+410, tp);}}for1(i, 1, n) for1(j, 1, m) {for(c=getchar(); c!=‘L‘&&c!=‘.‘; c=getchar());if(c==‘L‘) add(s, id(i, j), 1), ++ans;}for1(i, 1, n) for1(j, 1, m) if(a[i][j])for(int x=i-g; x<=i+g; ++x) for(int y=j-g; y<=j+g; ++y)if(a[x][y] && !(i==x && j==y) && check(i, j, x, y)) add(id(i, j)+410, id(x, y), oo);for1(i, 1, g) for1(j, 1, m) add(id(i, j)+410, t, oo), add(id(n-i+1, j)+410, t, oo);for1(i, 1, g) for1(j, 1, n) add(id(j, i)+410, t, oo), add(id(j, m-i+1)+410, t, oo);print(ans-isap(s, t, t+1));return 0;}

 

 

 

 

 

Description在一個r行c列的網格地圖中有一些高度不同的石砫,一些石砫上站著 一些蜥蜴,你的任務是讓盡量多的蜥蜴逃到邊界外。 每行每列中相鄰石砫的距離為1,蜥蜴的跳躍距離是d,即蜥蜴可以跳到平面距離不超過d的任何一個石砫上。石砫都不穩定,每次當蜥蜴跳躍時,所離開的石砫高 度減1(如果仍然落在地圖內部,則到達的石砫高度不變),如果該石砫原來高度為1,則蜥蜴離開後消失。以後其他蜥蜴不能落腳。任何時刻不能有兩隻蜥蜴在同 一個石砫上。Input輸入第一行為三個整數r,c,d,即地圖的規模與最大跳躍距離。以下r行為石竹的初始狀態,0表示沒有石砫,1~3表示石砫的初始高度。以下r行為蜥蜴位置,“L”表示蜥蜴,“.”表示沒有蜥蜴。Output輸出僅一行,包含一個整數,即無法逃離的蜥蜴總數的最小值。Sample Input5 8 2
00000000
02000000
00321100
02000000
00000000
........
........
..LLLL..
........
........

Sample Output1

HINT

100%的資料滿足:1<=r, c<=20, 1<=d<=3

【BZOJ】1066: [SCOI2007]蜥蜴(最大流)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.