最小費用最大流模板(存邊)

2021-07-15 19:30:58 字數 1498 閱讀 2203

函式功能介紹:

addedge(from,to,w,res) 新增一條 x->y,費用為w,殘量為res的邊,並一起新增其反向邊,由於從0號開始,相鄰兩個數代表的邊互為反向邊(即i號邊的反向邊是 i^1)。

spfa.init(n)初始化點數n

spfa.find(s,t) 在 源點為s,匯點為t的圖中尋找最小費用增廣路,i號點的前驅邊編號存在path[i]中

**如下(以nkoj 1589為例):

#include#include#include#include#include#include#include#include#define ll long long 

#define clear(***) memset(***,0,sizeof(***))

using namespace std;

const int inf=1e9;

const int maxn=1000+5;

int n,n,m,maxflow,mincost,last[maxn];

inline void _read(int &x)

struct edge

}; vectoredge;

void addedge(int from,int to,int w,int res)

int path[maxn], dist[maxn];

bool vis[maxn];

struct spfa

bool find(int s,int t);

line edge[5000005];

long long last[10005],_next[5000005];

void add_edge(long long x,long long y,long long l,long long acc)

bool findpath()

dis[n+1]=path[n+1]=0;

flag[n+1]=true;

q.push(n+1);

while(q.size())

}} }

if(dis[n+2]>n>>p>>tk>>wk>>tm>>wm;

n=2*n;

for(i=1;i<=n;i++)scanf("%i64d",&a[i]);

for(i=1;i<=n;i++)

for(i=1;i<=n;i++)

maxflow=0;

mincost=0;

while(findpath())addflow();

printf("%i64d\n",mincost);

}

最小費用最大流(拆邊)

題目大概意思是,有n個城市m條邊,要從1城市到n城市運送k的物品,求最少花費,每個邊有乙個係數ai花費的錢是ai 這條邊上運送物資數的平方,比如在係數為3的邊上運送了2的物品,則需要3 2 2的花費 思路 由於每條邊的容量不超過5,所以可以把每一條邊拆成容量條流量為1的邊,他們的花費分別為1 ai,...

最小費用最大流模板

const int n 1010 點 const int m 2 10010 邊 const int inf 1000000000 struct nodee m int next1 m point n dis n q n pre n ne ne為已新增的邊數,next,point為鄰接表,dis為花...

最小費用最大流模板

一 最小費用最大流的模型 在保證流量最大的前提下,所需的費用最小,這就是最小費用最大流問題 帶有費用的網路流圖 g v,e,c,w v 頂點 e 弧 c 弧的容量 w 單位流量費用。任意的弧對應非負的容量c i,j 和單位流量費用w i,j 滿足 流量f是g的最大流。在f是g的最大流的前提下,流的費...