題解 方格取數問題 網路流

2022-02-23 20:38:08 字數 1270 閱讀 3825

考慮這個要求"沒有共同邊",像極了最小割。

最小割:將圖依照\(s\)和\(t\)分為兩個互無交集的集合,並且使得刪去的元素(邊)的權值和最小。

然後我們看看這個問題,先要分類以確定和\(s\)在一起和和\(t\)在一起的點。顯然由於相鄰點是對立的所以我們直接相鄰的連\(inf\)邊表示這個相鄰關係無法被改變。這樣這條邊在最小割中就不會被鴿掉。

我們先對圖進行黑白染色,相鄰的黑白點之間連線\(inf\)邊,我們能改變的狀態是乙個點在不在集合裡面,所以我們讓規定黑色連\(s\),白色連\(t\),邊權就是點權,這個邊代表這個點是否存在。現在要求相鄰點不能同時存在且使代價最小,這樣剩下的數最大,直接最小割即可。

說的很麻煩實際上就是

對圖進行黑白染色,相鄰的黑白點之間連線\(inf\)邊,我們能改變的狀態是乙個點在不在集合裡面,所以我們讓規定黑色連\(s\),白色連\(t\),邊權就是點權,跑最小割。

非此即彼的關係就是最小割啦

#include#include#include#includeusing namespace std;  typedef long long ll;

inline int qr()

const int maxn=1e2+5;

int id[maxn][maxn];

int nodecnt;

int cnt(1),s,t;

struct e

e(const int&a,const int&b,const int&c)

}e[(maxn*maxn)<<4|1];

int head[maxn*maxn];

inline void add(const int&fr,const int&to,const int&w,const bool&f)

queue< int > q;

int d[maxn*maxn];

int cur[maxn*maxn],sum;

const int inf=0x3f3f3f3f;

inline bool bfs()}}

return d[t];

}int dfs(const int&now,int fl)

}return ret;

}inline int dinic()

int main()

}

}printf("%d\n",sum-dinic());

return 0;

}

方格取數 網路流

大致題意 給你乙個 n m 的矩陣,可以取任意多個數,但若你取了乙個數,那麼這個數上下左右的數你就都不能取,問能取到的最大值是多少。首先,我們可以把矩陣上的點都染成兩種顏色 第乙個點為黑色,它會影響的點為白色,這樣做下去 那麼我們就可以得到乙個二分圖,此時我們注意到,我們要做的是把這個二分圖按照衝突...

題解 方格取數問題

傳送門 在乙個有 m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。這個題目也是很明顯的網路流,奇偶性建圖,最後總和 最小割即為答案 i...

題解 方格取數問題

題目戳我 text 相鄰的不能取 黑白染色。染色完之後,我們需要對不能同時選擇的點連線一條流量為 infty 的邊,以保證它們不被割開。即,被割開的一定是連向 s 或 t 的之前連過的邊,邊權是點權。上述連邊保證圖聯通,並保證割掉的邊一定是之前連的邊權為點權的邊。如果不連 infty 的邊,則原圖本...