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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

Pool construction UVA - 1515 最小割模型

發(fā)布時(shí)間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pool construction UVA - 1515 最小割模型 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

傳送門(mén)

文章目錄

  • 題意:
  • 思路:

題意:

給你一個(gè)n?mn*mn?m的矩陣,包含字符#和.,將#變成.的代價(jià)是ddd,將.變成#的代價(jià)是fff,讓后將#和.隔開(kāi)的代價(jià)是bbb,現(xiàn)在讓你用最小的代價(jià)將#和.隔開(kāi),并且矩陣邊界必須是#。
n,m≤50n,m\le 50n,m50

思路:

看到將兩部分分開(kāi),自然的想到最小割的概念,所以引入源點(diǎn)和匯點(diǎn)考慮建圖。
首先是將源點(diǎn)與#連容量為ddd的邊,代表將#變成.的代價(jià),割掉說(shuō)明將#變成了.。
將.與匯點(diǎn)連代價(jià)是fff的邊,意義同上。
需要注意的是,在邊界上的#需要從匯點(diǎn)向其連一個(gè)容量為INFINFINF的邊,代表其不能被變成.。
還需要將每個(gè)點(diǎn)向其周?chē)B容量為bbb的邊,如果四周某個(gè)點(diǎn)與其相同,邊的含義是如果將其改變,即割掉源點(diǎn)跟他之間的邊,那么還需要割掉原本跟他相同的之間的邊。如果四周某個(gè)點(diǎn)跟他不同,邊的含義是如果不改變,需要割掉他們倆之間的邊。
讓后直接建圖跑就好啦。

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native") //#pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<map> #include<cmath> #include<cctype> #include<vector> #include<set> #include<queue> #include<algorithm> #include<sstream> #include<ctime> #include<cstdlib> #define X first #define Y second #define L (u<<1) #define R (u<<1|1) #define pb push_back #define mk make_pair #define Mid (tr[u].l+tr[u].r>>1) #define Len(u) (tr[u].r-tr[u].l+1) #define random(a,b) ((a)+rand()%((b)-(a)+1)) #define db puts("---") using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); } //void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); } //void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII;const int N=100010,M=N*2,mod=1e9+7,INF=0x3f3f3f3f; const double eps=1e-6;int n,m; char s[110][110]; int d,f,b; struct Maxflow {int n,m,S,T;int e[M],ne[M],w[M],h[N],hs[N],idx;int depth[N];void init() { idx=0; memset(h,-1,sizeof (h)); }inline void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;e[idx]=a,w[idx]=0,ne[idx]=h[b],h[b]=idx++;}bool bfs(){memset(depth,-1,sizeof (depth)); depth[S]=0;queue<int>q; q.push(S); hs[S]=h[S];while(q.size()){int t=q.front(); q.pop();for(int i=h[t];~i;i=ne[i]){int ver=e[i];if(depth[ver]==-1&&w[i]>0){depth[ver]=depth[t]+1;hs[ver]=h[ver];if(ver==T) return true;q.push(ver);}}}return false;}int dfs(int u,int flow){if(u==T) return flow;int d=flow;for(int i=hs[u];~i;i=ne[i]){int ver=e[i]; hs[u]=i;if(depth[ver]==depth[u]+1&&w[i]>0){int t=dfs(ver,min(w[i],d));if(!t) depth[ver]=-1;d-=t; w[i]-=t; w[i^1]+=t;if(!d) break;}}return flow-d;}int dinic(){int ans=0,flow;while(bfs()) while(flow=dfs(S,INF)) ans+=flow;return ans;} }MF; int dir[4][2]={1,0,-1,0,0,1,0,-1};int get(int i,int j) {return (i-1)*m+j; }int main() { // ios::sync_with_stdio(false); // cin.tie(0);int _; scanf("%d",&_);while(_--) {scanf("%d%d%d%d%d",&m,&n,&d,&f,&b);for(int i=1;i<=n;i++) scanf("%s",s[i]+1);int ans=0;for(int i=1;i<=n;i++) {if(s[i][1]=='.') s[i][1]='#',ans+=f;if(s[i][m]=='.') s[i][m]='#',ans+=f;}for(int i=1;i<=m;i++) {if(s[1][i]=='.') s[1][i]='#',ans+=f;if(s[n][i]=='.') s[n][i]='#',ans+=f;}MF.init(); MF.S=N-1,MF.T=N-2;for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) {if(s[i][j]=='#') {if(i==1||j==1||i==n||j==m) MF.add(MF.S,get(i,j),INF);else MF.add(MF.S,get(i,j),d);}else MF.add(get(i,j),MF.T,f);for(int k=0;k<4;k++) {int dx=i+dir[k][0];int dy=j+dir[k][1];if(dx<1||dy<1||dx>n||dy>m) continue;MF.add(get(i,j),get(dx,dy),b);}}}ans+=MF.dinic();printf("%d\n",ans);}return 0; } /**/

總結(jié)

以上是生活随笔為你收集整理的Pool construction UVA - 1515 最小割模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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