bzoj3232 圈地遊戲

2022-03-03 23:07:41 字數 1317 閱讀 3808

二分最小割。

乙個答案可行要滿足$ v-c*ans \leq 0 $

將s向每個點連邊,流量為該點權值,相鄰兩個點連邊,流量為邊的費用*ans,邊界上的點向邊界外面連邊,流量也為相應費用*ans。

可以發現,每一種割完連到s的點都是選了的點,選了的點和未選的點中間的邊的費用一定割了,未選的點的權值也沒有得到,所以是正確的。

這樣會不會有不滿足條件的情況呢?

答案是否定的,如果圈了兩個圈,那麼肯定有乙個圈大乙個圈小,那麼往上二分時一定是只選大的更優。

1 #include2 #include3 #include4 #include5 #include6 #include7

#define n 2550

8#define inf 0x7fffffff

9#define eps 1e-8

10using

namespace

std;

11int n,m,s,t,a[55][55],b[55][55],c[55][55

];12

double

sum;

13int id(int i,int

j)17

int e=2

,head[n];

18struct

edgeed[n<<4

];22

void add(int u,int v,double

f)28

intdep[n];

29bool

bfs()41}

42}43return0;

44}45double dfs(int x,double

f)53

if(f==0)break;54

}55if(ans==0)dep[x]=-1;56

return

ans;57}

58double

dinic()

63bool work(double

x)70

intmain()87}

88double l=0,r=1255

,mid,ans;

89while(r-l>eps)

94 printf("

%0.3lf\n

",ans);

95return0;

96 }

view code

還有一種費用流的演算法,可以通過判負環來判斷解是否可行,是把每個交點看作每個點

乙個點往右連時的邊權就是這條邊下面的點權和-這條邊的費用,往左連就是反過來把下面的刪去,往上下走只要加上邊的費用即可

然後就可以愉快的spfa了!

bzoj 3232 圈地遊戲

題意 在乙個n m的網格裡,邊上有花費,格里有權值 從任意乙個點開始繞一圈,繞乙個簡單環出來,裡面的所有格仔就是收益 求最大的收益 花費 所有數 100 題解 考慮01分數規劃的方式,但是花費和權值不在一起 那麼考慮將格內的權值轉化到邊上 實際上將邊有向化,按邊方向左面一行的權值為正,右面為負,加起...

BZOJ3232 圈地遊戲

膜拜下whx大爺 好神的做法 首先比值型別的最大值一般要二分答案轉判定。現在要你找到乙個環使得c mid v 0。這十分類似spfa判負環 所以我們考慮建圖找負環,每個網格線的交點向周圍四個方向建邊,邊權怎麼辦呢?將格仔上的數在列方向做字首和,a i j 表示第j列,前i行格仔的權值和,b i j ...

BZOJ3232 圈地遊戲

bzoj dzy家的後院有一塊地,由n行m列的方格組成,格仔內種的菜有一定的價值,並且每一條單位長度的格線有一定的費用。dzy喜歡在地里散步。他總是從任意乙個格點出發,沿著格線行走直到回到出發點,且在行走途中不允許與已走過的路線有任何相交或觸碰 出發點除外 記這條封閉路線內部的格仔總價值為v,路線上...