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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P2774 方格取数问题

發布時間:2025/4/9 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P2774 方格取数问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目背景

none!

題目描述

在一個有 m*n 個方格的棋盤中,每個方格中有一個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計一個滿足要求的取數算法。對于給定的方格棋盤,按照取數要求編程找出總和最大的數。

輸入輸出格式

輸入格式:

第 1 行有 2 個正整數 m 和 n,分別表示棋盤的行數和列數。接下來的 m 行,每行有 n 個正整數,表示棋盤方格中的數。

輸出格式:

程序運行結束時,將取數的最大總和輸出

輸入輸出樣例

輸入樣例#1:? 3 3 1 2 3 3 2 3 2 3 1 輸出樣例#1:? 11

說明

m,n<=100

Solution:   網絡流套路題。   一個點若選,會使得其四方向鄰格不能被選,若以坐標和的奇偶性為基準,則圖會被分為兩部分,不難發現同一部分的點是不會互相影響的,這恰好是二分圖的形式。   我們從$s$向所有奇數點連點值大小的邊,從偶數點向$t$連點值大小的邊,然后從奇數點向受影響的偶數點連inf的邊。由于要求的是點值和最大的情況,先要使選的情況合法(即使$s,t$不聯通),且不選的點值和最小,那么這不就是最小割嘛!所以只要用點值和-最小割就是答案了。(好套路的黑白點啊)
代碼: /*Code by 520 -- 8.25*/ #include<bits/stdc++.h> #define il inline #define ll long long #define RE register #define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++) #define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--) #define debug printf("%d %s\n",__LINE__,__FUNCTION__) using namespace std; const int N=100005,inf=233333333,dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; int n,m,s,t,dis[N],to[N],net[N],w[N],h[N],cnt=1; int mp[105][105],ans;il int id(int x,int y){return (x-1)*m+y;}il void add(int u,int v,int c){to[++cnt]=v,net[cnt]=h[u],w[cnt]=c,h[u]=cnt;to[++cnt]=u,net[cnt]=h[v],w[cnt]=0,h[v]=cnt; }queue<int>q; il bool bfs(){memset(dis,-1,sizeof(dis));q.push(s),dis[s]=0;while(!q.empty()){RE int u=q.front();q.pop();for(RE int i=h[u];i;i=net[i])if(dis[to[i]]==-1&&w[i]) dis[to[i]]=dis[u]+1,q.push(to[i]);}return dis[t]!=-1; }int dfs(int u,int op){if(u==t)return op;int flow=0,used=0;for(RE int i=h[u];i;i=net[i]){int v=to[i];if(dis[to[i]]==dis[u]+1&&w[i]){used=dfs(to[i],min(op,w[i]));if(!used)continue;flow+=used,op-=used;w[i]-=used,w[i^1]+=used;if(!op)break;}}if(!flow) dis[u]=-1;return flow; }il void init(){scanf("%d%d",&n,&m),t=n*m+1;For(i,1,n) For(j,1,m) {scanf("%d",&mp[i][j]),ans+=mp[i][j];(i+j)&1?add(s,id(i,j),mp[i][j]):add(id(i,j),t,mp[i][j]); }For(i,1,n) For(j,1,m)if((i+j)&1) {For(k,0,3){RE int xx=i+dx[k],yy=j+dy[k];if(xx>0&&xx<=n&&yy>0&&yy<=m) add(id(i,j),id(xx,yy),inf);}}while(bfs()) ans-=dfs(s,inf);cout<<ans; }int main(){init();return 0; }

?

轉載于:https://www.cnblogs.com/five20/p/9537561.html

總結

以上是生活随笔為你收集整理的P2774 方格取数问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。