在乙個有 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,分別表示棋盤的行...