最小费用最大流邻接表模板

来源:互联网 发布:multisim13数据库下载 编辑:程序博客网 时间:2024/05/22 14:30
int dis[N],pre[N],head[N],visit[N],yong;void init() {memset(head,-1,sizeof(head));yong=0;}void build(int u,int v,int w,int f) {bian[yong].u=u;bian[yong].v=v;bian[yong].w=w;bian[yong].f=f;bian[yong].next=head[u];head[u]=yong++;}void adde(int u,int v,int w,int f) {build(u,v,w,f);build(v,u,-w,0);}int spfa(int s,int t) {memset(visit,0,sizeof(visit));memset(pre,-1,sizeof(pre));for(int i=0;i<=t;i++)//注意是从0开始而不是从s开始dis[i]=inf;queue<int>q; visit[s]=1;//必须是s q.push(s); dis[s]=0; while(!q.empty ()) { int u=q.front (); for(int index=head[u];index!=-1;index=bian[index].next) { int v=bian[index].v; if(bian[index].f&&dis[v]>dis[u]+bian[index].w) { dis[v]=dis[u]+bian[index].w; pre[v]=index; if(!visit[v]) { visit[v]=1; q.push (v); } } } q.pop(); visit[u]=0;//是u } if(dis[t]==inf) return -1; return dis[t];}int min_cost(int s,int t) {   int sum=0,k,i;   while((k=spfa(s,t))!=-1){    int minn=inf;    i=pre[t];    while(i!=-1) {        if(minn>bian[i].f)            minn=bian[i].f;        i=pre[bian[i].u];    }    sum=sum+minn*k;    i=pre[t];    while(i!=-1){        bian[i].f-=minn;        bian[i^1].f+=minn;        i=pre[bian[i].u];    }   }   return sum;}


                                             
0 0
原创粉丝点击