最小费用
来源:互联网 发布:加工中心直接图纸编程 编辑:程序博客网 时间:2024/04/26 19:05
#define INF 1e9#define N 1000#define M 1000100struct Edge{ int to,next,cost,flow;}edge[M];int head[N],ip;int que[N],dis[N],pre[N];bool visit[N];bool spfa(int start,int end,int numpoint){ int front=-1,tail=-1,to,top,temp; memset(visit,0,sizeof(visit)); memset(pre,-1,sizeof(pre)); for(int i=0;i<=numpoint;i++) dis[i]=INF; que[++tail]=start; dis[start]=0; visit[start]=1; while(front!=tail) { if(++front>numpoint) front-=numpoint; top=que[front]; visit[top]=0; for(int p=head[top];p!=-1;p=edge[p].next) { if(edge[p].flow>0) { to=edge[p].to; temp=edge[p].cost+dis[top]; if(dis[to]>temp) { dis[to]=temp; pre[to]=p; //记录前驱边 if(!visit[to]) { visit[to]=1; if(++tail>numpoint) tail-=numpoint; que[tail]=to; } } } } } if(dis[end]==INF) return 0; return 1;}int mincost(int start,int end,int numpoint){ int u,mn; int ans_flow=0,ans_cost=0; while(spfa(start,end,numpoint)) { u=end; mn=INF; while(pre[u]!=-1) { mn=min(edge[pre[u]].flow,mn); u=edge[ pre[u]^1 ].to; } u=end; while(pre[u]!=-1) { edge[pre[u]].flow-=mn; edge[pre[u]^1].flow+=mn; u=edge[ pre[u]^1 ].to ; } ans_cost+=dis[end]*mn; // ans_flow+=mn; } return ans_cost;}void add(int u,int v,int f,int c){ edge[ip].to=v;edge[ip].flow=f;edge[ip].next=head[u];edge[ip].cost=c;head[u]=ip++; edge[ip].to=u;edge[ip].flow=0;edge[ip].next=head[v];edge[ip].cost=-c;head[v]=ip++;}