luoge P2774 方格取數問題(最小割)

2021-09-25 22:42:06 字數 1676 閱讀 7772

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

對棋盤中的點進行黑白染色,將所有(i+j)為奇數的劃分到白色,為偶數的劃分到黑色,所有白色的點向其四周連容量為無限大的邊,源點向白色點連容量為權值的邊,黑色點向匯點連容量為權值的邊,總的邊權減去最小割即是答案。

可行性:因為黑白點之間連線的是容量無限大的邊,因此,不可能被割去,所有一旦選擇了乙個點,則其四周的點九不能被選擇了

#include

using

namespace std;

typedef

long

long ll;

#define int long long

const

int maxn=

505;

const

int maxm=

5e5+5;

const

int inf=

0x3f3f3f3f

;struct edgeedge[maxm]

;int tol;

int head[maxn]

;void

init()

void

addedge

(int u,

int v,

int w,

int rw=0)

int q[maxn]

;int dep[maxn]

,cur[maxn]

,sta[maxn]

;bool

bfs(

int s,

int t,

int n)}}

return

false;}

intdinic

(int s,

int t,

int n)

maxflow+

=tp;

for(

int i=tail-

1;i>=

0;i--

) u=edge[sta[tail]^1

].to;

}else

if(cur[u]!=-

1&&edge[cur[u]

].cap>edge[cur[u]

].flow&&dep[u]+1

==dep[edge[cur[u]

].to]

)else}}

return maxflow;

}int a[

105]

[105];

int n,m;

inline

inthash

(int x,

int y)

inline

void

connect

(int u,

int v,

bool col)

int32_t

main()

}for

(int i=

1;i<=n;i++)}

printf

("%lld\n"

,ans-

dinic

(s,t,t+1)

);}

Luogu2774 方格取數問題

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

P2774 方格取數問題

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

P2774 方格取數問題

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