洛谷P2774 方格取數問題 最小割

2021-09-08 05:18:31 字數 1539 閱讀 4292

$n \times m$的矩陣,不能取相鄰的元素,問最大能取多少

首先補集轉化一下:最大權值 = sum - 使圖不連通的最小權值

進行黑白染色

從s向黑點連權值為點權的邊

從白點向t連權值為點券的邊

黑點向白點連權值為inf的邊

這樣就轉化成了最小割問題,跑dinic即可

/*

首先補集轉化一下:最大權值 = sum - 使圖不連通的最小權值

進行黑白染色

從s向黑點連權值為點權的邊

從白點向t連權值為點券的邊

黑點向白點連權值為inf的邊

跑dinic

*/#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1e5 + 10, inf = 1e9 + 10

;inline

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *f;

}int n, m, a[101][101], black[101][101], s, t = 100001

;struct

edge e[maxn];

int head[maxn], cur[maxn], num = 0

;inline

void add_edge(int x, int y, int

z) ;

head[x] = num++;

}inline

void addedge(int x, int y, int

z) int trans(int x, int

y) int xx[5] = ;

int yy[5] = ;

intdeep[maxn];

inline

intbfs()

}return

deep[t];

}int dfs(int x, int

flow)

}return

ansflow;

}int

dinic()

return

ans;

}int

main()

}else

addedge(trans(i, j), t, a[i][j]);

}printf("%d

", sum -dinic());

return0;

}/*3 31 000 00-

1 00- 0-+

2 0-- -++

*/

洛谷P2774 方格取數問題

洛谷p2774方格取數問題 題目鏈結 將題目反著考慮,假設現在所有數都取,需要刪掉一部分數,使得剩下的數沒有公共邊且刪掉的數之和最小。容易發現,兩個位置有公共邊當且僅當他們橫縱座標的和的奇偶性不同。建立乙個二分圖,左邊為座標和為奇數的點,右邊為座標和為偶數的點,將左右兩邊存在公共邊的點連起來。s向左...

洛谷 P2774 方格取數問題

通過題目描述我們可以很明顯的看出要通過二分圖建模,二分圖求最大獨立點集很容易,就是建立二分圖求n 最小割,然而這裡加入了權值,而且權值是在點上的,那麼我們對於每個點連一條到源點或匯點的容量等於權值的邊,求最小割即可,見胡伯濤 include include include include inclu...

洛谷P2774 方格取數問題

題目鏈結 將題目反著考慮,假設現在所有數都取,需要刪掉一部分數,使得剩下的數沒有公共邊且刪掉的數之和最小。容易發現,兩個位置有公共邊當且僅當他們橫縱座標的和的奇偶性不同。建立乙個二分圖,左邊為座標和為奇數的點,右邊為座標和為偶數的點,將左右兩邊存在公共邊的點連起來。s向左邊的每個點建邊,權值為點的權...