費用流(模板)

2021-08-14 13:34:02 字數 1465 閱讀 9131

費用流模板

spfa不停找當前從s到t的最小費用路,然後重新整理最大流

這裡把每條邊的cost為0,同樣就可以求最大流,不過有點慢

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

#define inf 0x3f3f3f3f

#define mem(a,b) memset(a,b,sizeof(a))

const int n=5000+20;

const int m=50000+20;

int top;//當前邊下標

int dis[n],pre[n];//源點到點i的最小距離,pre[i]記錄前驅

bool vis[n];//標記陣列

int c[n];//入隊次數

int maxflow;

struct vertex

v[n];

struct edge

e[m*2];

void init()

void add_edge(int u,int v,int c,int cost)

void add(int u,int v,int c,int cost)

bool spfa(int s,int t,int n)}}

}if(dis[t]==inf)

return false;

return true;

}int mcmf(int s,int t,int n)//mincostmaxflow

mincost+=dis[t]*d;//dis[t]為該路徑上單位流量費用之和

}return mincost;

}int main()

v[n];

struct edge

e[m*2];

void init()

void add_edge(int u,int v,int c,int cost)

void add(int u,int v,int c,int cost)

bool spfa(int s,int t,int n)}}

}if(dis[t]==inf)

return false;

return true;

}int mcmf(int s,int t,int n)//mincostmaxflow

mincost+=dis[t]*d;//dis[t]為該路徑上單位流量費用之和

}return mincost;

}int main()

{ int n,m,s,t,u,v,flow,cost;

scanf("%d%d%d%d",&n,&m,&s,&t);

init();

for(int i=0;i

費用流模板

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...

費用流模板

我借鑑了一些大神的 也就是他們經常用的模板。費用流模板 include includeusing namespace std const int oo 1e9 const int mm 11111 const int mn 888 int node,src,dest,edge int ver mm ...

網路流 費用流模板

中求的是最小費用最大流,求最大費用最大流只需要在設定邊權時設定為原權值的相反數,執行一次最小費用最大流,計算得出最小費用的相反數就是要求的最大費用。u x v x w x c x 分別表示 x 號邊的出發點,到達點,權值和殘量。1 intspfa 29 dis s 0 10 head tail 1 ...