code vs 方格取數3

2021-07-10 12:43:12 字數 1494 閱讀 6067

時間限制: 2 s

空間限制: 256000 kb

題目等級 : 大師 master

題解

檢視執行結果

«問題描述:

在乙個有m*n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任

意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。

«程式設計任務:

對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。

輸入描述 input description

第1 行有2 個正整數m和n,分別表示棋盤的行數

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

輸出描述 output description

將取數的最大總和輸出

樣例輸入 sample input

3 31 2 3

3 2 3

2 3 1

樣例輸出 sample output

11 資料範圍及提示 data size & hint

n,m<=30

分類標籤 tags 點此展開 

題解:最小割.

這道題利用最小割等於最大流的思想。如何建圖,是關鍵,剛開始沒想出來,後經神犇指點,頓悟。

首先將方格進行黑白染色,就是黑白交錯分布,所有黑格相鄰的都是白格,所有白格相鄰的都是黑格,然後從源點向所以黑格連邊,容量為黑格的權值,從所有白格向匯點連邊,容量為白格的權值,再從所有黑格向所有相鄰的白格連邊,容量為inf。然後最終跑最大流即可。

為什麼呢?最小割等於最大流。因為我們要是所選方格互不相連,且和最大,那麼捨棄的邊就要盡可能少。因為相鄰的點只能選乙個,所有每乙個可流的路徑,通過限流都只能選擇黑白點中較小的那乙個,從而保證捨棄的最少。

#include#include#include#include#includeusing namespace std;

int n,m,a[1000][1000],sum;

int point[10000],next[20000],v[20000],remain[20000],tot=-1;

int num[10000],cur[10000],deep[10000],laste[10000];

const int inf=1e9;

void add(int x,int y,int z)

int addflow(int s,int t)

now=t;

while(now!=s)

return minn;

}void bfs(int s,int t)

}int isap(int s,int t)

else

add((i-1)*m+j,n*m+1,a[i][j]);

}else

else

add((i-1)*m+j,n*m+1,a[i][j]); }}

printf("%d",sum-isap(0,n*m+1));

}

方格取數3

時間限制 2 s 空間限制 256000 kb 在乙個有m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任 意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。程式設計任務 對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。輸入描述 inp...

codevs 1907 方格取數3

這個系列終於做完了。又是一道網路流 因為不能取相鄰的點,很容易發現需要二分圖 一半的點連源,另一半連匯,流量為map i,j 相鄰的點連起來,流量為inf 答案就是總和減最大流 最大流。看這篇吧 include include include include define inf 0x3f3f3f3...

codevs 1907 方格取數 3

在乙個有m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。第1 行有2 個正整數m和n,分別表示棋盤的行數和列數。接下來的m行,每行有n個正整數,表示棋盤方格中的數。對於給定的方格棋盤,按照取數要...