我借鑑了一些大神的**也就是他們經常用的模板。。。
費用流模板
#include#includeusing namespace std;
const
int oo=1e9;
const
int mm=11111;
const
int mn=888;
int node,src,dest,edge;
int ver[mm],flow[mm],cost[mm],next[mm];
int head[mn],dis[mn],p[mn],q[mn],vis[mn];
/**這些變數基本與最大流相同,增加了
cost 表示邊的費用,
p 記錄可行流上節點對應的反向邊
*/void prepare(int _node,int _src,int _dest)
void addedge(int u,int v,int f,int c)
/**以上同最大流*/
/**spfa 求最短路,並用p 記錄最短路上的邊*/
bool spfa()
return p[dest]>-1;
}/**源點到匯點的一條最短路即可行流,不斷的找這樣的可行流*/
int spfaflow()
return ret;
}
但是還有下面這個**好像比上面的快一點。。。
#include
#include
using
namespace
std;
const
int oo=1e9;//無窮大
const
int maxm=1111111;//邊的最大數量,為原圖的兩倍
const
int maxn=2222;//點的最大數量
int node,src,dest,edge;//node節點數,src源點,dest匯點,edge邊數
int head[maxn],p[maxn],dis[maxn],q[maxn],vis[maxn];//head煉表頭,p記錄可行流上節點對應的反向邊,dis計算距離
struct edgenode
edges[maxm];
void prepare(int _node,int _src,int _dest);
void addedge(int u,int v,int f,int c);
bool spfa();
inline
int min(int a,int b)
edge=0;
}void addedge(int u,int v,int f,int c)
bool spfa()}}
return p[dest]>=0;
}int spfaflow()
for (int i=p[dest]; i>=0; i=p[edges[i].to])
ret+=delta*dis[dest];
}return ret;
}
費用流模板
const int oo 1e9 無窮 const int mm 11111111 邊 const int mn 888888 點 int node,src,dest,edge int ver mm flow mm cost mm nex mm int head mn dis mn p mn q m...
費用流(模板)
費用流模板 spfa不停找當前從s到t的最小費用路,然後重新整理最大流 這裡把每條邊的cost為0,同樣就可以求最大流,不過有點慢 include include include include include include include include include include incl...
網路流 費用流模板
中求的是最小費用最大流,求最大費用最大流只需要在設定邊權時設定為原權值的相反數,執行一次最小費用最大流,計算得出最小費用的相反數就是要求的最大費用。u x v x w x c x 分別表示 x 號邊的出發點,到達點,權值和殘量。1 intspfa 29 dis s 0 10 head tail 1 ...