日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【bzoj】 1412: [ZJOI2009]狼和羊的故事

發(fā)布時(shí)間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【bzoj】 1412: [ZJOI2009]狼和羊的故事 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Description

“狼愛上羊啊愛的瘋狂,誰讓他們真愛了一場(chǎng);狼愛上羊啊并不荒唐,他們說有愛就有方向......” Orez聽到這首歌,心想:狼和羊如此和諧,為什么不嘗試羊狼合養(yǎng)呢?說干就干! Orez的羊狼圈可以看作一個(gè)n*m個(gè)矩陣格子,這個(gè)矩陣的邊緣已經(jīng)裝上了籬笆。可是Drake很快發(fā)現(xiàn)狼再怎么也是狼,它們總是對(duì)羊垂涎三尺,那首歌只不過是一個(gè)動(dòng)人的傳說而已。所以O(shè)rez決定在羊狼圈中再加入一些籬笆,還是要將羊狼分開來養(yǎng)。 通過仔細(xì)觀察,Orez發(fā)現(xiàn)狼和羊都有屬于自己領(lǐng)地,若狼和羊們不能呆在自己的領(lǐng)地,那它們就會(huì)變得非常暴躁,不利于他們的成長。 Orez想要添加籬笆的盡可能的短。當(dāng)然這個(gè)籬笆首先得保證不能改變狼羊的所屬領(lǐng)地,再就是籬笆必須修筑完整,也就是說必須修建在單位格子的邊界上并且不能只修建一部分。

Input

文件的第一行包含兩個(gè)整數(shù)n和m。接下來n行每行m個(gè)整數(shù),1表示該格子屬于狼的領(lǐng)地,2表示屬于羊的領(lǐng)地,0表示該格子不是任何一只動(dòng)物的領(lǐng)地。

Output

文件中僅包含一個(gè)整數(shù)ans,代表籬笆的最短長度。

Sample Input

2 2
2 2
1 1

Sample Output

2

數(shù)據(jù)范圍
10%的數(shù)據(jù) n,m≤3
30%的數(shù)據(jù) n,m≤20
100%的數(shù)據(jù) n,m≤100
明顯最小割? 挖掘柵欄的本質(zhì):只能建在相鄰兩個(gè),且建好后使得狼和羊之間不存在通路。而割的定義是:使S集和T集不存在通路。而題目又要求建的柵欄最少,于是就是最小割問題了。 主要是建邊 從源點(diǎn)連向狼的無窮邊 從羊向匯點(diǎn)的無窮邊? 再是狼到空地和羊 空地到空地和羊 1 #include<queue> 2 #include<cstdio> 3 #include<iostream> 4 #define MAXN 100010 5 6 const int INF=0x7fffffff; 7 8 using namespace std; 9 10 int map[101][101]; 11 12 int n,m,st,en,ans; 13 14 int x[4]={0,1,0,-1}; 15 int y[4]={1,0,-1,0}; 16 17 struct node { 18 int to; 19 int next; 20 int val; 21 }; 22 node e[MAXN]; 23 24 int head[MAXN],tot=1; 25 26 int depth[MAXN],cur[MAXN]; 27 28 queue<int> q; 29 30 inline void read(int&x) { 31 int f=1;x=0;char c=getchar(); 32 while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();} 33 while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-48;c=getchar();} 34 x=x*f; 35 } 36 37 inline void add(int x,int y,int val) { 38 e[++tot].to=y; 39 e[tot].val=val; 40 e[tot].next=head[x]; 41 head[x]=tot; 42 } 43 44 inline int bfs() { 45 for(int i=0;i<=en;i++) cur[i]=head[i],depth[i]=-1; 46 while(!q.empty()) q.pop(); 47 q.push(st);depth[st]=0; 48 while(!q.empty()) { 49 int u=q.front(); 50 q.pop(); 51 for(int i=head[u];i!=0;i=e[i].next) { 52 int to=e[i].to; 53 if(e[i].val>0&&depth[to]==-1) { 54 depth[to]=depth[u]+1; 55 q.push(to); 56 if(to==en) return true; 57 } 58 } 59 } 60 return false; 61 } 62 63 inline int dinic(int now,int flow) { 64 if(now==en) return flow; 65 int rest=0,delat; 66 for(int & i=cur[now];i!=0;i=e[i].next) { 67 int to=e[i].to; 68 if(depth[to]==depth[now]+1&&e[i].val>0) { 69 delat=dinic(to,min(e[i].val,flow-rest)); 70 if(delat) { 71 e[i].val-=delat; 72 e[i^1].val+=delat; 73 rest+=delat; 74 if(rest==flow) break; 75 } 76 } 77 } 78 if(flow!=rest) depth[now]=-1; 79 return rest; 80 } 81 82 int main() { 83 read(n);read(m); 84 en=n*m+1; 85 for(int i=1;i<=n;i++) 86 for(int j=1;j<=m;j++) { 87 read(map[i][j]); 88 if(map[i][j]==1) add(st,(i-1)*m+j,INF),add((i-1)*m+j,st,0); 89 else if(map[i][j]==2) add((i-1)*m+j,en,INF),add(en,(i-1)*m+j,0); 90 } 91 for(int i=1;i<=n;i++) 92 for(int j=1;j<=m;j++) 93 for(int k=0;k<4;k++) { 94 int xx=i+x[k]; 95 int yy=j+y[k]; 96 if(xx<1||yy<1||xx>n||yy>m||map[i][j]==2) continue; 97 if(map[xx][yy]!=1) add((i-1)*m+j,(xx-1)*m+yy,1),add((xx-1)*m+yy,(i-1)*m+j,0); 98 } 99 while(bfs()) ans+=dinic(st,INF); 100 printf("%d\n",ans); 101 return 0; 102 } 代碼

?

轉(zhuǎn)載于:https://www.cnblogs.com/whistle13326/p/7192828.html

總結(jié)

以上是生活随笔為你收集整理的【bzoj】 1412: [ZJOI2009]狼和羊的故事的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。