poj2135 最小费用最大流

来源:互联网 发布:seo如何做外链 编辑:程序博客网 时间:2024/04/30 02:50
ek算法

无向图用邻接表加两条边,(u,v)和(v,u);

加源点(s,1)cap=2;

加(n,t)cap=2;

#include<iostream>#include<iterator>#include<vector>#include<limits.h>#include<string.h>#include<stdio.h>#include<queue>#define MAX 1010using namespace std;struct node{int x;int y;int cap;int cost;int next;}map[MAX*MAX];int h[MAX];int mapnow=0;void init(){memset(h,-1,sizeof(h));mapnow=2;}void additem(int u,int v ,int c,int d){map[mapnow].x=u;map[mapnow].y=v;map[mapnow].cost=c;map[mapnow].cap=d;map[mapnow].next=h[u];h[u]=mapnow++;map[mapnow].x=v;map[mapnow].y=u;map[mapnow].cost=-c;map[mapnow].cap=0;map[mapnow].next=h[v];h[v]=mapnow++;}int ek(int s,int t){queue<int>q;int pre[MAX],re[MAX];bool visit[MAX];int dist[MAX];int tot=0;int i,j,u,v,inm;while(1){for(i=s;i<=t;i++){dist[i]=INT_MAX;}dist[s]=0;memset(visit,0,sizeof(visit));visit[s]=true;q.push(s);while(!q.empty()){u=q.front();q.pop();visit[u]=false;inm=h[u];while(inm!=-1){v=map[inm].y;if(map[inm].cap>0&&dist[v]>dist[u]+map[inm].cost){dist[v]=dist[u]+map[inm].cost;pre[v]=u;re[v]=inm;if(!visit[v]){q.push(v);visit[v]=true;}}inm=map[inm].next;}}if(dist[t]==INT_MAX)break;int a=INT_MAX;for(u=t;u!=s;u=pre[u])if(a>map[re[u]].cap)    a=map[re[u]].cap;for(u=t;u!=s;u=pre[u]){map[re[u]].cap-=a;map[re[u]^1].cap+=a;}tot+=a*dist[t];}return tot;}int main(){int m,n;int i,u,v,c;while(scanf("%d%d",&n,&m)!=EOF){init();for(i=0;i<m;i++){scanf("%d%d%d",&u,&v,&c);additem(u,v,c,1);additem(v,u,c,1);}additem(0,1,0,2);additem(n,n+1,0,2);printf("%d\n",ek(0,n+1));}}


原创粉丝点击