bzoj1475 方格取數

2022-05-19 09:03:51 字數 771 閱讀 5258

最小割,這也是個經典題了,當初學最小割時沒學會,這次算是理解了,首先二分圖染色,將整個圖分成黑色點和白色點,由於相鄰的格仔不能同時選,乙個黑點一定對應四個白點,也就是我們只能選擇這個黑點或者四個白點,就再建出乙個超級源點和超級匯點,將每個黑點與超級源點連邊,容量為點權,每個白點與匯點連邊,容量也為點權,這是顯然的,然後對於那些相鄰的黑點和白點(指的是原圖上相鄰),連一條容量為inf的邊,跑出來的最大流即為最小割,總點權-最小割即為答案

#include#include#include#includeusing namespace std;

void read(int &x)

#define rg register

#define min(a,b) (aq;

int sum,ans,dis[30001],n,m,s,inf=1e9,t,pre[70001],nxt[70001],h[30001],v[70001],cnt=1;

void add(int x,int y,int z)

bool bfs()

return dis[t];

}int dfs(int x,int flow)

if(flow==f)dis[x]=-1;

return flow-f;

}int main()

else add((i-1)*m+j,t,x);

}for(;bfs();ans+=dfs(s,inf));

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

}

bzoj 1475 方格取數

在乙個n n的方格裡,每個格仔裡都有乙個正整數。從中取出若干數,使得任意兩個取出的數所在格仔沒有公共邊,且取出的數的總和盡量大。第一行乙個數n n 30 接下來n行每行n個數描述乙個方陣 僅乙個數,即最大和 21 2 3 56 同1324 exca王者之劍。最大流。都一樣。n m的矩形變成n n i...

BZOJ 1475 方格取數 最小割

在乙個n n的方格裡,每個格仔裡都有乙個正整數。從中取出若干數,使得任意兩個取出的數所在格仔沒有公共邊,且取出的數的總和盡量大。建圖比較巧妙。將方格看成01奇偶矩陣,黑白染色。將s與所有黑點連邊,權為黑點的權值,將所有白點與t連邊,權為白點的權值,相鄰格仔之間從黑點到白點連邊,權為inf。答案就是總...

bzoj1475 方格取數(最小割)

題目傳送門 水。解法 沒有公共邊也就是格仔不相鄰。那麼把整個圖黑白染色。相鄰的顏色不一樣。那麼就最小割唄。把所有點個成兩個集合。乙個黑色點的集合,乙個白色點的集合。黑色點都沒有公共邊白色點也沒有公共點。好水的最小割做完前面的題發現這道才是最水的。實現 include include include ...