BZOJ3232 圈地遊戲

2021-07-11 02:05:24 字數 1211 閱讀 7707

膜拜下whx大爺…好神的做法…

首先比值型別的最大值一般要二分答案轉判定。現在要你找到乙個環使得c*mid-v<0。這十分類似spfa判負環…

所以我們考慮建圖找負環,每個網格線的交點向周圍四個方向建邊,邊權怎麼辦呢?將格仔上的數在列方向做字首和,a[i][j]表示第j列,前i行格仔的權值和,b[i][j]是橫向的格線上的費用,那麼橫向格線的邊從左向右方向的權值是b[i][j]*mid+a[i][j],從右往左的權值是b[i][j]*mid-a[i][j],表示對於每一列來說,加上第一次經過的那條邊向上所有格仔的權值,減去第二次經過的那條邊向上所有格仔的權值,加上第三次,減掉第四次…以此類推,這樣如果原圖中存在一條負環,就說明存在一條迴路,使得c*mid-v<0。

為什麼不會出現下圖這種情況呢?顯然下圖這種情況,只選擇一塊不劣…

(論看題的重要性…我還以為必須是左上角到右下角的一條迴路,想了好長時間不會…所以我們也可以很簡單建圖網路流判定的,但是個人感覺不如spfa優美巧妙…)

#include

#include

#include

#include

#include

//by:mirrorgray

using namespace std;

const int y=53,n=2711,m=2111111;

const double eps=1e-6;

int n,m,cnt,pos[y][y];

int a[y][y],b[y][y],c[y][y];

int inq[n],vis[n];

double dis[n],len[m];

int tot=-1,head[n],ver[m],nxt[m];

int mx=,my=;

queue q;

void add(int

x,int

y)bool spfa()

while(!q.empty())

}return false;

}bool judge(double mid)

return spfa();

}int main()

printf("%.3f\n",(l+r)/2);

return

0;}

bzoj 3232 圈地遊戲

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

bzoj3232 圈地遊戲

二分最小割。乙個答案可行要滿足 v c ans leq 0 將s向每個點連邊,流量為該點權值,相鄰兩個點連邊,流量為邊的費用 ans,邊界上的點向邊界外面連邊,流量也為相應費用 ans。可以發現,每一種割完連到s的點都是選了的點,選了的點和未選的點中間的邊的費用一定割了,未選的點的權值也沒有得到,所...

BZOJ3232 圈地遊戲

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