最小費用最大流肯定要保證最大流,所以它和最大流有一些類似的性質。如果把費用看成邊,就可以每次走最短路(保證費用最小),走到不能走為止(保證最大流)。費用流版的ek就是這樣。需要注意的是,反向弧的邊權為它對應的正向弧的費用的相反數,所以最短路要用spfa來求。
費用流版的dinic,又叫zkw費用流,還是多路增廣的思想。
#include#includeek#include
#include
#include
#include
#include
#include
#define maxn 5010
#define maxm 100010
using
namespace
std;
intfir[maxn],nxt[maxm],v[maxm],fl[maxm],w[maxm],cnt;
int n,m,dis[maxn],s,t,inf[5
],mincost,maxflow;
intp[maxn],flp[maxn],kp[maxn];
bool
vis[maxn];
intread()
while(isdigit(c)) x = x*10 + c - '
0', c =getchar();
return x*f;
}void addedge(int u1,int v1,int fl1,int
w1)bool
spfa()}}
vis[u]=0
; }
return dis[t]==inf[0]?0:1;}
void
dfs()
maxflow+=flp[t];
return;}
intmain()
while
(spfa())dfs();
cout
"<
}
#include#includedinic#include
#include
#include
#include
#include
#include
#define maxn 5010
#define maxm 100010
using
namespace
std;
intfir[maxn],nxt[maxm],v[maxm],fl[maxm],w[maxm],cnt;
int n,m,dis[maxn],s,t,inf[5
],mincost,maxflow;
bool
vis[maxn];
queue
q;intread()
while(isdigit(c)) x = x*10 + c - '
0', c =getchar();
return x*f;
}void addedge(int u1,int v1,int fl1,int
w1)bool
spfa()
vis[v[k]]=1
; }}}
vis[u]=0
; }
while(!q.empty())q.pop();
return dis[s]==inf[0]?0:1;}
int dfs(int u,int
nowflow)
}vis[u]=0
;
return
sum;
}int
main()
while
(spfa())
cout
"<
}
並不對勁的splay
splay和不加任何旋轉一定會被卡的二叉搜尋樹的唯一區別就是每次操作把當前節點旋轉到根。旋轉有各種zig zag的組合方式,感覺很麻煩,並不對勁的人並不想講。其實可以找出一些共性將它們合併。設ls a 點a是其父親的左兒子 son a 0 a的左兒子,son a 1 a的右兒子,fa a a的父親。...
並不對勁的字尾陣列
字尾陣列sa x 表示排序後第x位在排序前的位置。這個東西的求法有兩種,一種是倍增,時間複雜度o n log n 或o n log2n 另一種是用不知道什麼方法做到的o n 至於第二種方法是什麼,並不對勁的人並不知道,所以只說倍增。考慮正常地比較兩個字串,都是從頭比較到尾 那麼,如果把兩個字串都斷成...
並不對勁的卡常技巧
俗話說的好,心中有黨,常數極小。1 迴圈中加暫存器優化for register int i i n i 好像在開o2時這個沒什麼用。2 函式前inline int f int x 當呼叫函式本身的時間長度比執行函式的更長時效果會更顯著。配合read write 使用更佳。3 將取模運算改成if x ...