考慮這個要求"沒有共同邊",像極了最小割。
最小割:將圖依照\(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 的邊,則原圖本...