函式功能介紹:
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的最大流的前提下,流的費...