題目描述
最近房地產商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。棋子是沒有區別的 跳動的規則很簡單,任意選一顆棋子,對一顆中軸棋子跳動。跳動後兩顆棋子距離不變。一...