BZOJ2132 圈地計畫(最小割)

2021-07-11 01:19:03 字數 1809 閱讀 2131

傳送門

抄黃學長的題解。

黑白染色,對於每個黑點a,s->a:w商業,a->t:w工業,對於每個白點b,s->b:w工業,b->t:w商業,對於每對有關係的兩點a,b,a<–>b:c1+c2。

這個建模感受一下就是對的。

看黃學長的姿勢之後發現中間那兩條邊沒加反向邊,但是據atp說加了也沒錯,只是慢了一點。

應該就是兩邊都能流叭

#include

#include

#include

#include

using

namespace

std;

const

int max_n=105;

const

int max_m=105;

const

int max_n=max_n*max_m+2;

const

int max_m=max_n*10;

const

int max_e=max_m;

const

int inf=1e9;

int n,m,n,now,cnt,sum,maxflow;

int now1,now2,now3,now4;

int a[max_n][max_m],b[max_n][max_m],c[max_n][max_m],color[max_n][max_m];

int tot,point[max_n],next[max_e],v[max_e],remain[max_e];

int deep[max_n],cur[max_n];

queue

q;inline

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

inline

void addedge(int x,int y,int cap)

inline

bool bfs(int s,int t)

}return deep[t]inline

int dfs(int now,int t,int limit)

}return flow;

}inline

void dinic(int s,int t)

int main()

else

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

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

else

if (!color[i][j]) continue;

if (i!=1) now1=now-m,add(1+now,1+now1,c[i][j]+c[i-1][j]),add(1+now1,1+now,c[i][j]+c[i-1][j]),sum+=c[i][j]+c[i-1][j];

if (i!=n) now2=now+m,add(1+now,1+now2,c[i][j]+c[i+1][j]),add(1+now2,1+now,c[i][j]+c[i+1][j]),sum+=c[i][j]+c[i+1][j];

if (j!=1) now3=now-1,add(1+now,1+now3,c[i][j]+c[i][j-1]),add(1+now3,1+now,c[i][j]+c[i][j-1]),sum+=c[i][j]+c[i][j-1];

if (j!=m) now4=now+1,add(1+now,1+now4,c[i][j]+c[i][j+1]),add(1+now4,1+now,c[i][j]+c[i][j+1]),sum+=c[i][j]+c[i][j+1];

}dinic(1,n);

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

}

BZOJ 2132 圈地計畫 最小割

題目大意 有乙個n m的矩陣,在矩陣中填1或2會得到不同的權值。相鄰的兩個格仔數字不相同會得到額外的權值,求最大權值 最小割模型 同一事件兩種選擇獲得不同收益,一定條件下有額外收益,求最大收益。在本題中,相鄰格仔填不同數字會獲得額外收益,於是將矩陣黑白染色 i j 1 每個黑色格仔與s連邊代表填1,...

BZOJ2132 圈地計畫 最小割

最近房地產商gdoi group of dumbbells or idiots 從noi nuts old idiots 手中得到了一塊開發土地。據了解,這塊土地是一塊矩形的區域,可以縱橫劃分為n m塊小區域。gdoi要求將這些區域分為商業區和工業區來開發。根據不同的地形環境,每塊小區域建造商業區和...

BZOJ 2132 圈地計畫 最小割

首先黑白染色 因為相鄰的節點顏色必不同 相同顏色的節點之間沒有關係 沒有邊 然後add s,黑色點,a i j 黑色點,t,b i j s,白色點,b i j 白色點,t,a i j 因為黑色點和白色點同屬乙個s t才有額外貢獻 所以這裡a i j b i j 要交換連 sum初始為矩陣裡每個點的a...