傳送門
抄黃學長的題解。
黑白染色,對於每個黑點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...