洛谷2774:[网络流24题]方格取数问题——题解
生活随笔
收集整理的這篇文章主要介紹了
洛谷2774:[网络流24题]方格取数问题——题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.luogu.org/problemnew/show/P2774#sub
在一個有 m*n 個方格的棋盤中,每個方格中有一個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。
試設計一個滿足要求的取數算法。對于給定的方格棋盤,按照取數要求編程找出總和最大的數。
最小割問題(然而我最開始想的是帶權二分圖……沒準他們是一樣的……?)
先黑白染色,這樣黑點只能影響周圍的白點,那么設源點為S,匯點為T。
則黑點向S連邊權為其格子數的權值的邊,白點向T同理。
然后黑點和其影響的白點連INF的邊。
這樣的話我們的INF的邊不可以被刪,就只能在取黑不取白或取白不取黑之間猶豫了,最后的最小割即是我們選擇放棄的權值。
格子權值總和-最小割即可。
#include<cstdio> #include<cmath> #include<iostream> #include<vector> #include<cstring> #include<algorithm> #include<cctype> using namespace std; typedef long long ll; const int N=100100; const int M=800100; const int INF=1e9; inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } struct node{int nxt,to,w; }edge[M]; int head[N],cnt=-1,S,T; inline void add(int u,int v,int w){edge[++cnt].to=v;edge[cnt].w=w;edge[cnt].nxt=head[u];head[u]=cnt;edge[++cnt].to=u;edge[cnt].w=0;edge[cnt].nxt=head[v];head[v]=cnt; } int lev[N],cur[N],dui[N]; bool bfs(int m){int r=0;for(int i=1;i<=m;i++){lev[i]=-1;cur[i]=head[i];}dui[0]=S,lev[S]=0;int u,v;for(int l=0;l<=r;l++){u=dui[l];for(int e=head[u];e!=-1;e=edge[e].nxt){v=edge[e].to;if(edge[e].w>0&&lev[v]==-1){ lev[v]=lev[u]+1;r++;dui[r]=v; if(v==T)return 1; }}}return 0; } int dinic(int u,int flow,int m){if(u==m)return flow;int res=0,delta;for(int &e=cur[u];e!=-1;e=edge[e].nxt){int v=edge[e].to;if(edge[e].w>0&&lev[u]<lev[v]){ delta=dinic(v,min(edge[e].w,flow-res),m); if(delta>0){edge[e].w-=delta;edge[e^1].w+=delta;res+=delta;if(res==flow)break; }}}if(res!=flow)lev[u]=-1;return res; } int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; int main(){memset(head,-1,sizeof(head));int m=read(),n=read();ll ans=0;S=m*n+1,T=S+1;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){int x=(i-1)*n+j,k=i+j,w=read();ans+=w;if(k&1){add(S,x,w);for(int l=0;l<4;l++){int nx=i+dx[l],ny=j+dy[l];if(nx<1||nx>m||ny<1||ny>n)continue;int y=(nx-1)*n+ny;add(x,y,INF);}}else add(x,T,w);}}while(bfs(T))ans-=dinic(S,INF,T);printf("%lld\n",ans);return 0; }+++++++++++++++++++++++++++++++++++++++++++
?+本文作者:luyouqi233。 +
?+歡迎訪問我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
轉載于:https://www.cnblogs.com/luyouqi233/p/8492900.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的洛谷2774:[网络流24题]方格取数问题——题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Openstack云计算项目实施 其一(
- 下一篇: wpgcms---列表页数据渲染