大致題意:給你乙個\(n*m\)的矩陣,可以取任意多個數,但若你取了乙個數,那麼這個數上下左右的數你就都不能取,問能取到的最大值是多少。
首先,我們可以把矩陣上的點都染成兩種顏色(第乙個點為黑色,它會影響的點為白色,這樣做下去)。
那麼我們就可以得到乙個二分圖,此時我們注意到,我們要做的是把這個二分圖按照衝突關係分為兩個點集且要最優。
再結合資料範圍,演算法就很顯然了。網路流最小割。
具體建圖步驟:
源點與所有的黑點連邊,容量為該點點權,白點與匯點連邊,容量為該點點權。
再把所有的黑點和與該黑點產生衝突的白點連邊,容量為inf
這樣我們得到的最小割就是滿足條件的需要捨棄的最小值。答案就是全部值-捨棄值。
最後再根據最小割=最大流這一性質,就能很快的做出此題了
需要注意的是,此題為\(m\)行\(n\)列
#include#include#include#include#include#define n 40001
#define inf 1926081700
using namespace std;
int dx[4]=;
int dy[4]=;
int n,m,mp[101][101];
int s,t,ans,cnt=1,head[n/4+11];
struct edgeedge[n*2+9];
void ins(int x,int y,int z)
namespace network_flow}}
return dep[t];
}int dfs(int x,int rest)
}return flow;
}int dinic()
}int num(int x,int y)
void ins(int x,int y)
}}int read()
while(isdigit(ch))
return x*f;
}int main()else
printf("%d",ans-dinic());
return 0;
}
題解 方格取數問題 網路流
考慮這個要求 沒有共同邊 像極了最小割。最小割 將圖依照 s 和 t 分為兩個互無交集的集合,並且使得刪去的元素 邊 的權值和最小。然後我們看看這個問題,先要分類以確定和 s 在一起和和 t 在一起的點。顯然由於相鄰點是對立的所以我們直接相鄰的連 inf 邊表示這個相鄰關係無法被改變。這樣這條邊在最...
網路流24題 方格取數
先對棋盤黑白染色 這是常見套路 我們發現,如果選了乙個黑點,那相鄰的白點就不能選,反之同理 出現了衝突關係,考慮最大權閉合子圖 把黑點看成正權點,白點看成負權點,黑點向相鄰白點連邊,跑最大權閉合子圖即可 include include include include define maxc 205 ...
網路流24題 方格取數
p2774 傳送門 方格取數和最大且要求兩兩沒有公共邊 遇到方格內的不相鄰問題,考慮黑白染色來對點分類 問題轉化為使黑點不和白點相鄰的最小代價,其中每個點的代價只計算一次 明顯的集合劃分模型,用最小割解決 include using namespace std define x first defi...