首先二分答案(dinkelbach?不知道行不行),然後就變成判斷是否可行了。
這裡有乙個比較巧妙的方法,就是給圈地定乙個方向,不妨為逆時針,那麼向上走就相當於把它左邊的加入答案;向下走就相當於把它左邊的從答案中減去,然後判斷是否存在負權迴路即可。
另外還可以網路流建圖,所有塊從s連邊容量為價值,然後在外面加一圈向t連邊容量為邊權inf,然後任意兩個相鄰的塊(包括外面一圈)連雙向邊容量為邊的費用。然後跑最小割從答案中減去即可。
ac**如下:
#include#include#include#define n 55
#define m 100005
using namespace std;
int m,n,cnt,h[m+5][2],s[n][n],mp[n][n][4],num[n][n];
double d[n][n],len[n][n][4]; bool bo[n][n];
const int dx[4]=,dy[4]=;//0上 1下 2左 3右
bool ok(double t)
}int head=0,tail=cnt,u=0,v=0;
for (i=1; i<=cnt; i++)
}} }
return 0;
}int main()
for (i=0; i<=m; i++)
for (j=1; j<=n; j++)
for (i=1; i<=m; i++)
for (j=0; j<=n; j++)
double l=0,r=m*n*100,mid;
while (l+1e-6
by lych
2016.4.13
bzoj 3232 圈地遊戲
題意 在乙個n m的網格裡,邊上有花費,格里有權值 從任意乙個點開始繞一圈,繞乙個簡單環出來,裡面的所有格仔就是收益 求最大的收益 花費 所有數 100 題解 考慮01分數規劃的方式,但是花費和權值不在一起 那麼考慮將格內的權值轉化到邊上 實際上將邊有向化,按邊方向左面一行的權值為正,右面為負,加起...
BZOJ3232 圈地遊戲
膜拜下whx大爺 好神的做法 首先比值型別的最大值一般要二分答案轉判定。現在要你找到乙個環使得c mid v 0。這十分類似spfa判負環 所以我們考慮建圖找負環,每個網格線的交點向周圍四個方向建邊,邊權怎麼辦呢?將格仔上的數在列方向做字首和,a i j 表示第j列,前i行格仔的權值和,b i j ...
bzoj3232 圈地遊戲
二分最小割。乙個答案可行要滿足 v c ans leq 0 將s向每個點連邊,流量為該點權值,相鄰兩個點連邊,流量為邊的費用 ans,邊界上的點向邊界外面連邊,流量也為相應費用 ans。可以發現,每一種割完連到s的點都是選了的點,選了的點和未選的點中間的邊的費用一定割了,未選的點的權值也沒有得到,所...