SPOJ 371 Boxes 最小費用流

2021-06-22 14:16:33 字數 1464 閱讀 1122

題目大意:n個盒子圍成一圈,第i個盒子裡最開始有ai個球。每次可以把乙個小球移動到相鄰的盒子裡。問,想使每個盒子裡的球的數目不超過1個,最少移動多少次。

這個題還是比較簡單的。源點到每個盒子,連邊(s,i,ai,0),每個盒子到匯點建邊(i,t,1,0),相鄰盒子建邊(i,j,∞,1)。

//#pragma comment(linker, "/stack:102400000,102400000")

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define mp(x,y) make_pair((x),(y))

#define pb(x) push_back(x)

//typedef __int64 ll;

//typedef unsigned __int64 ull;

/* ****************** */

const int inf=100011122;

const double inff=1e100;

const double eps=1e-8;

const int mod=9999991;

const int nn=1005;

const int mm=2000010;

/* ****************** */

struct g

e[nn*4*2];

int p[nn],t;

int dd[nn],qw[nn],ff[nn],pre[nn];

bool inq[nn];

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

bool find_path(int st,int en,int n,int &flow,int &cost)

head=tail=0;

qw[tail++]=st;

inq[st]=true;

dd[st]=0;

ff[st]=inf;

while(head!=tail)}}

}}

if(dd[en]==inf)return false;

flow+=ff[en];

cost+=ff[en]*dd[en];

u=en;

while(u!=st)

return true;

}int mincost(int st,int en,int n)

int main()

add(i,i==1?n:i-1,inf,1);

add(i,i==n?1:i+1,inf,1);

}ans=mincost(0,n+1,n+1);

printf("%d\n",ans);

}return 0;

}

最小費用流

include include define maxn 61 define maxv maxn maxn 2 1 define maxe maxv 5 define oo 2147483647 define min a,b a b b a define maxq maxe using namespa...

最小費用流

int v 頂點數 vector g max v int dist max v 最短距離 int prev max v 最短路中前驅結點對應的點 int pree max v 最短路中前驅結點對應的邊 void addedge int from,int to,int cap,int cost 求從s...

最小費用流

acm模版 最小費用流 o v e f init network g g.build v,e call g.mincost s,t flow g.flow cost g.cost 注意 spfa增廣,實際複雜度遠遠小於o v e define typef int type of flow defin...