題解 方格取數問題

2022-04-29 21:30:47 字數 967 閱讀 3147

題目戳我

\(\text\)

相鄰的不能取——黑白染色。

染色完之後,我們需要對不能同時選擇的點連線一條流量為\(\infty\)的邊,以保證它們不被割開。(即,被割開的一定是連向\(s\)或\(t\)的之前連過的邊,邊權是點權。)

上述連邊保證圖聯通,並保證割掉的邊一定是之前連的邊權為點權的邊。如果不連\(\infty\)的邊,則原圖本不連通,也就不會進行最小割了。

注意到,同樣顏色的點互相不影響,所以可以隨便割。而顏色不同的點,由於之前分到的集合不一樣,而割掉一條邊意味著我不選擇這個點,這也意味著它將屬於另乙個集合。而最後一定會被那個總體的答案減去最小割後記錄下這個點被劃分到另乙個集合的貢獻。

#includeusing namespace std;

const int maxn=5e5+10;

const int inf=(1<<30);

const int dx[4]=;

const int dy[4]=;

struct ee[maxn];

int tot=1,head[maxn],cur[maxn],dep[maxn],n,m,s,t,ans;

inline void add(int x,int y,int w)

bool bfs(int s,int t)

} }return false;

}int dfs(int s,int flow,int t)

} return flow-rest;

}int dinic(int s,int t)

inline int num(int i,int j)

int main()

for(int i=1;i<=n;++i)

for(int j=1;j<=m;++j)

} printf("%d\n",ans-dinic(s,t));

return 0;

}

題解 方格取數問題

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

題解 方格取數

給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。包括多個測試例項,每個測試例項包括乙個整數n nn和n n n times n n n個非負數 n 20 n leq 20 n 2...

題解 方格取數問題 網路流

考慮這個要求 沒有共同邊 像極了最小割。最小割 將圖依照 s 和 t 分為兩個互無交集的集合,並且使得刪去的元素 邊 的權值和最小。然後我們看看這個問題,先要分類以確定和 s 在一起和和 t 在一起的點。顯然由於相鄰點是對立的所以我們直接相鄰的連 inf 邊表示這個相鄰關係無法被改變。這樣這條邊在最...