1907 方格取數 3

2022-05-03 10:18:19 字數 1434 閱讀 7961

時間限制: 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

資料範圍及提示 data size & hint

n,m<=30

【題解】:最大點權獨立集

黑白染色,s到x集合中的點邊容量為該點權值,y到t同,不能同時取的兩個格仔連一條無窮大的邊,結果是所有格仔權值和減去最小割

//同題:【tyvj1338】qq農場

#include#include

using

namespace

std;

const

int n=210,m=1e5+10

;const

int inf=0x3f3f3f3f

;const

int dx=;

const

int dy=;

struct

nodee[m*10];int tot=1

;int n,m,num,s,t,id[n][n],mp[n][n],head[m],dis[m],q[m*10

];void add(int x,int y,int

z)bool inside(int x,int

y)bool

bfs()}}

return dis[t]}int dfs(int x,int

f) }

dis[x]=0

;

return

used;

}int

dinic()

void

int cnt=0

;

for(int i=1;i<=n;i++)

}for(int i=1;i<=n;i++)

}else

add(id[i][j],t,mp[i][j]);}}

}int

main()

}printf("%d

",dinic());

return0;

}

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個正整數,表示棋盤方格中的數。對於給定的方格棋盤,按照取數要...

Codevs 1907 方格取數 3 最小割

傳送門 1907 方格取數 3 思路 直接求取哪些不好求,但是我們可以求要捨棄哪些,將所有格仔分成兩部分,使得每一部分中都沒有相鄰的格仔,然後一部分連線源點,另一部分連線匯點,權值為格仔中的數字,兩部分中原本相鄰的格仔之間連邊,權值為inf,這樣圖中任意乙個割即為可以捨棄的一種組合,最小割就是所有可...