費用流模板
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 ...