最小费用最大流模板

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #define inf 2147483647
 8 using namespace std;
 9 struct data
10 {
11     int from,to,next,cup,flow,cost;
12     data(){from=-1,to=-1,next=-1,cup=-1,flow=-1,cost=-1;}
13 }e[200];
14 int vis[200],head[200],d[200],p[200],a[200];
15 int cnt,flow,cost;
16 int n,m;
17 void add(int u,int v,int w,int c)
18 {e[cnt].from=u,e[cnt].to=v,e[cnt].next=head[u],head[u]=cnt,e[cnt].cup=w,e[cnt].flow=0,e[cnt].cost=c,cnt++;}
19 bool spfa(int s,int t)
20 {
21     memset(vis,0,sizeof(vis));
22     for(int i=1;i<=n;i++) d[i]=inf;
23     queue<int>q;
24     q.push(s);
25     d[s]=0,vis[s]=1,p[s]=0,a[s]=inf;
26     while(!q.empty())
27     {
28         int now=q.front();
29         q.pop();
30         vis[now]=0;
31         for(int i=head[now];i>=0;i=e[i].next)
32         {
33             if(e[i].cup>e[i].flow&&d[e[i].from]<inf&&d[e[i].to]>d[e[i].from]+e[i].cost)
34             {
35                 d[e[i].to]=d[e[i].from]+e[i].cost;
36                 p[e[i].to]=i;
37                 a[e[i].to]=min(a[e[i].from],e[i].cup-e[i].flow);
38                 if(!vis[e[i].to])
39                 {
40                     q.push(e[i].to);
41                     vis[e[i].to]=1;
42                 }
43             }
44         }
45     }
46     if(d[t]==inf) return false;
47     flow+=a[t];
48     cost+=d[t]*a[t];
49     int now=t;
50     while(now!=s)
51     {
52         e[p[now]].flow+=a[t];
53         e[p[now]^1].flow-=a[t];
54         now=e[p[now]].from;
55     }
56     return true;
57 }
58 int main()
59 {
60     memset(head,-1,sizeof(head));
61     
62     scanf("%d%d",&n,&m);
63     for(int i=1;i<=m;i++)
64     {
65         int u,v,w,c;
66         scanf("%d%d%d%d",&u,&v,&w,&c);
67         add(u,v,w,c);
68         add(v,u,0,-c);
69     }
70     int s,t;
71     scanf("%d%d",&s,&t);
72     while(spfa(s,t));
73     cout<<flow<<' '<<cost;
74 }
View Code

 

posted @ 2016-06-19 21:28  wls001  阅读(169)  评论(0编辑  收藏  举报