P2774 方格取數問題

2021-10-02 10:29:19 字數 1468 閱讀 5993

題目描述

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

輸入格式

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

輸出格式

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

題解:首先對棋盤放個染色,可以發現產生矛盾的都是顏色不同的格仔,設(i+j)為奇數的為白色,那麼我們可以設定超級源點與白色方格相連,超級匯點與黑色方格相連,中間相鄰的黑白色方格連邊,設定為inf,這樣連完以後,可以發現源點到匯點的增廣路就是存在矛盾的兩個位置,所以我們只需要割掉圖中的一些邊,滿足割掉的邊權最小

跑個最小割即可

ac**:

#pragma gcc optimize(2)

#include

#include

using

namespace std;

using

namespace __gnu_cxx;

#define ll long long

const

int maxn =

20000+50

;const

int maxm =

2e6+50;

const

int mod =

1e9+7;

const

int inf =

0x3f3f3f3f

;int m,n,s,t,tot=

1,head[maxn]

,to[maxm]

,nxt[maxm]

,w[maxm]

,h[maxn]

;int a[

105]

[105

],dir[

2]=,

,,};

inline

void

ade(

int u,

int v,

int ww)

inline

void

add(

int u,

int v,

int w)

inline

intbfs()

}}return h[t];}

inline

intdfs

(int x,

int f)}if

(!fl) h[x]=-

1;return fl;

}inline

intdinic()

signed

main()

}}}printf

("%d\n"

,sum-

dinic()

);return0;

}

P2774 方格取數問題

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

P2774 方格取數問題

對棋盤黑白染色,源點向黑點連邊,匯點向白點連邊,權值均為這個點的權值。然後所有的黑點向白點連一條 inf 的邊。這樣求出的最小割一定會割掉與源點和匯點相連的邊,割掉這條邊相當於不選這個點。所以最後答案就是所有點的權值 最小割。include include include include defin...

P2774 方格取數問題

傳送門 考慮一開始把所有點都選了,再放棄一些點使得選擇合法 考慮求出最小的放棄掉的價值 看到棋盤先黑白染色冷靜一下 從 s 向所有黑點連一條流量為點權的邊,如果滿流表示我放棄這個點的價值 從所有白點向所有 t 連邊,如果滿流說明我放棄這個點的價值 從所有黑點 x 向它四個方向的四個白點 a,b,c,...