題意:
在乙個n*m的網格裡,邊上有花費,格里有權值;
從任意乙個點開始繞一圈,繞乙個簡單環出來,裡面的所有格仔就是收益;
求最大的收益/花費;
所有數<=100;
題解:
考慮01分數規劃的方式,但是花費和權值不在一起;
那麼考慮將格內的權值轉化到邊上;
實際上將邊有向化,按邊方向左面一行的權值為正,右面為負,加起來作為選了這條邊的權值;
這樣在圍成乙個環的過程中會將外面的點消掉,而裡面的點是四倍大小;
問題轉化成二分答案,對乙個圖進行check,考慮其中有沒有正權的環;
上乙個bf判斷就好了;
時間複雜度o(n^2*m^2*log400);
二分上界定為400就可以了,別忘了答案要除4;
**:
#include#include#include#define n 110
using namespace std;
int to[n*n<<2],next[n*n<<2],val[n*n<<2],cost[n*n<<2],head[n*n],tot;
int n,m,l[n][n],u[n][n],num[n][n];
double dis[n*n];
void add(int x,int y,int v,int c)
bool check(double l)
} if(!flag)
return 0;
} return 1;
}int main()
} for(i=0;i<=n;i++) }
for(i=1;i<=n;i++) }
double l=0,r=400,mid;
while(r-l>1e-5)
printf("%.3lf",l/4);
return 0;
}
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的點都是選了的點,選了的點和未選的點中間的邊的費用一定割了,未選的點的權值也沒有得到,所...
BZOJ3232 圈地遊戲
bzoj dzy家的後院有一塊地,由n行m列的方格組成,格仔內種的菜有一定的價值,並且每一條單位長度的格線有一定的費用。dzy喜歡在地里散步。他總是從任意乙個格點出發,沿著格線行走直到回到出發點,且在行走途中不允許與已走過的路線有任何相交或觸碰 出發點除外 記這條封閉路線內部的格仔總價值為v,路線上...