BZOJ2132 圈地計畫 最小割

2022-05-20 09:59:26 字數 1463 閱讀 5208

最近房地產商gdoi(group of dumbbells or idiots)從noi(nuts old idiots)手中得到了一塊開發土地。據了解,這塊土地是一塊矩形的區域,可以縱橫劃分為n×m塊小區域。gdoi要求將這些區域分為商業區和工業區來開發。根據不同的地形環境,每塊小區域建造商業區和工業區能取得不同的經濟價值。更具體點,對於第i行第j列的區域,建造商業區將得到aij收益,建造工業區將得到bij收益。另外不同的區域連在一起可以得到額外的收益,即如果區域(i,j)相鄰(相鄰是指兩個格仔有公共邊)有k塊(顯然k不超過4)型別不同於(i,j)的區域,則這塊區域能增加k×cij收益。經過tiger.s教授的勘察,收益矩陣a,b,c都已經知道了。你能幫gdoi求出乙個收益最大的方案麼?

輸入第一行為兩個整數,分別為正整數n和m,分別表示區域的行數和列數;第2到n+1列,每行m個整數,表示商業區收益矩陣a;第n+2到2n+1列,每行m個整數,表示工業區收益矩陣b;第2n+2到3n+1行,每行m個整數,表示相鄰額外收益矩陣c。第一行,兩個整數,分別是n和m(1≤n,m≤100);

任何數字不超過1000」的限制

輸出只有一行,包含乙個整數,為最大收益值。

3 31 2 3

4 5 6

7 8 9

9 8 7

6 5 4

3 2 1

1 1 1

1 3 1

1 1 1

81【資料規模】

對於100%的資料有n,m≤100

題解:如果相鄰的兩點相同,則獲得收益,那麼這就變成最小割的裸題了。那麼不同怎麼辦呢?黑白染色,黑點翻轉源匯即可。

#include #include #include #include #define p(a,b) ((a-1)*m+b)

using namespace std;

const int inf=1<<30;

queueq;

int n,m,tot,s,t,ans,cnt=1;

int dx=,dy=;

int a[110][110],b[110][110],c[110][110],d[100010],head[100010],next[2000010],val[2000010],to[2000010];

void add(int a,int b,int c)

int dfs(int x,int mf)

}return mf-temp;

}int bfs()}}

return 0;

}inline int rd()

while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();

return ret*f;

}int main()

} while(bfs()) ans-=dfs(s,inf);

printf("%d",ans);

return 0;

}

BZOJ2132 圈地計畫(最小割)

傳送門 抄黃學長的題解。黑白染色,對於每個黑點a,s a w商業,a t w工業,對於每個白點b,s b w工業,b t w商業,對於每對有關係的兩點a,b,a b c1 c2。這個建模感受一下就是對的。看黃學長的姿勢之後發現中間那兩條邊沒加反向邊,但是據atp說加了也沒錯,只是慢了一點。應該就是兩...

BZOJ 2132 圈地計畫 最小割

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

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...