洛谷 P1935 國家集訓隊 圈地計畫 最小割

2021-08-22 19:42:30 字數 1963 閱讀 5234

題目描述

最近房地產商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。

輸出格式:

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

輸入輸出樣例

輸入樣例#1:

3 3

1 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

輸出樣例#1:

81 說明

n, m ≤ 100; 0 ≤ aij, bij, cij ≤ 1000

對於30%的資料有n, m ≤ 6

對於50%的資料有n, m ≤ 20

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

分析:

顯然是乙個最小割模型。

大概長這樣……

然而這題是不同的有貢獻,那就把左右對調即可,因為這個是棋盤,可以使用黑白染色。

**:

#include 

#include

#include

#include

const

int maxn=1e5+7;

const

int maxe=3e5+7;

const

int inf=0x3f3f3f3f;

using

namespace

std;

struct edgeg[maxn];

int n,m,s,t,cnt,x,ans;

int ls[maxn],dis[maxn],v[maxn];

int c[105][105];

int dx[4]=;

int dy[4]=;

queue

q;int po(int x,int y)

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

; ls[x]=cnt;

g[++cnt]=(edge);

ls[y]=cnt;

}bool bfs()}}

if (dis[t]!=inf) return

1; else

return0;}

int dfs(int x,int maxf)

}return ret;

}int main()

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

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

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

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

printf("%d",ans);

}

題解 洛谷 P1935 國家集訓隊 圈地計畫

還是那個經典trick 最大價值 總價值 最小花費 每個位置都是二選一,考慮乙個魚刺型建圖。然後就是需要描述乙個,如果 x 選了第 p 種方案,那麼如果它的鄰點也選了第 p 種方案,就有 c 的代價,也就是有一條 c 流量的邊需要割掉。但是如果直接 s 連向每個格仔的邊流量為 a 每個格仔流向 t ...

洛谷 P1505 國家集訓隊 旅遊

洛谷傳送門 ray 樂忠於旅遊,這次他來到了 t 城。t 城是乙個水上城市,一共有 nn 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有 n 1n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人...

洛谷 P1852 國家集訓隊 跳跳棋

跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲 棋盤上有3顆棋子,分別在a,b,c這三個位置。我們要通過最少的跳動把他們的位置移動成x,y,z。棋子是沒有區別的 跳動的規則很簡單,任意選一顆棋子,對一顆中軸棋子跳動。跳動後兩顆棋子距離不變。一...