p2774 方格取數問題
emm........仔細一看,這不是最大權閉合子圖的題嗎!
取乙個點$(x,y)$,限制條件是同時取$(x,y+1),(x,y-1),(x+1,y),(x-1,y)$,只不過權值取負而已
於是我們把圖分為黑點和白點,同顏色點之間不相鄰,不同顏色的點相鄰(如將$(x+y)%2==1$的點記為黑點)
假裝把白點的權值都看成負的
記$link(p,q,val)$為$p$向$q$連一條$val$的邊(包括反向邊)
藍後根據最大權閉合子圖的套路
對於黑點$p$與相鄰的白點$q$
$link(s,p,val_p)$
$link(p,q,inf)$
$link(q,t,val_q)$($val_q$不取負)
藍後就可以愉快地跑最小割辣
#include#include#include
#include
using
namespace
std;
#define n 100005
#define inf 1000000000
const
int d1[4]=;
const
int d2[4]=;
int n,m,d[n],cur[n],tot,s,t; bool
vis[n];
queue
h;int cnt=1
,hd[n],nxt[n],ed[n],poi[n],val[n];
inline
void adde(int x,int y,int
v)inline
void link(int x,int y,int v)
inline
int id(int x,int y)
bool
bfs()
}return
vis[t];
}int dfs(int x,int
a)return
f;
}int
dinic()
return
re;}
void draw(int x,int
y) }
else
link(p,t,w);
}int
main()
P2774 方格取數問題
題目描述 在乙個有 m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。輸入格式 第 1 行有 2 個正整數 m 和 n,分別表示棋盤的行...
P2774 方格取數問題
none 在乙個有 m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。輸入格式 第 1 行有 2 個正整數 m 和 n,分別表示棋盤的行...
P2774 方格取數問題
對棋盤黑白染色,源點向黑點連邊,匯點向白點連邊,權值均為這個點的權值。然後所有的黑點向白點連一條 inf 的邊。這樣求出的最小割一定會割掉與源點和匯點相連的邊,割掉這條邊相當於不選這個點。所以最後答案就是所有點的權值 最小割。include include include include defin...