膜拜下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,路線上...