二分最小割。
乙個答案可行要滿足$ v-c*ans \leq 0 $
將s向每個點連邊,流量為該點權值,相鄰兩個點連邊,流量為邊的費用*ans,邊界上的點向邊界外面連邊,流量也為相應費用*ans。
可以發現,每一種割完連到s的點都是選了的點,選了的點和未選的點中間的邊的費用一定割了,未選的點的權值也沒有得到,所以是正確的。
這樣會不會有不滿足條件的情況呢?
答案是否定的,如果圈了兩個圈,那麼肯定有乙個圈大乙個圈小,那麼往上二分時一定是只選大的更優。
1 #include2 #include3 #include4 #include5 #include6 #include7view code#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 }
還有一種費用流的演算法,可以通過判負環來判斷解是否可行,是把每個交點看作每個點
乙個點往右連時的邊權就是這條邊下面的點權和-這條邊的費用,往左連就是反過來把下面的刪去,往上下走只要加上邊的費用即可
然後就可以愉快的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,路線上...