最小费用最大流

 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdio.h>
 4 #include <algorithm>
 5 #include <queue>
 6 #define V 10100
 7 #define E 1000100
 8 #define inf 99999999
 9 using namespace std;
10 int vis[V];
11 int dist[V];
12 int pre[V];
13 
14 struct Edge{
15     int u,v,c,cost,next;
16 }edge[E];
17 int head[V],cnt;
18 
19 void init(){
20     cnt=0;
21     memset(head,-1,sizeof(head));
22 }
23 void addedge(int u,int v,int c,int cost)
24 {
25     edge[cnt].u=u;edge[cnt].v=v;edge[cnt].cost=cost;
26     edge[cnt].c=c;edge[cnt].next=head[u];head[u]=cnt++;
27 
28     edge[cnt].u=v;edge[cnt].v=u;edge[cnt].cost=-cost;
29     edge[cnt].c=0;edge[cnt].next=head[v];head[v]=cnt++;
30 }
31 
32 bool spfa(int begin,int end){
33     int u,v;
34     queue<int> q;
35     for(int i=0;i<=end+2;i++){
36         pre[i]=-1;
37         vis[i]=0;
38         dist[i]=inf;
39     }
40     vis[begin]=1;
41     dist[begin]=0;
42     q.push(begin);
43     while(!q.empty()){
44         u=q.front();
45         q.pop();
46         vis[u]=0;
47         for(int i=head[u];i!=-1;i=edge[i].next){
48             if(edge[i].c>0){
49                 v=edge[i].v;
50                 if(dist[v]>dist[u]+edge[i].cost){
51                     dist[v]=dist[u]+edge[i].cost;
52                     pre[v]=i;
53                     if(!vis[v]){
54                         vis[v]=true;
55                         q.push(v);
56                     }
57                 }
58             }
59         }
60     }
61     return dist[end]!=inf;
62 }
63 
64 int MCMF(int begin,int end){
65     int ans=0,flow;
66     int flow_sum=0;
67     while(spfa(begin,end)){
68         flow=inf;
69         for(int i=pre[end];i!=-1;i=pre[edge[i].u])
70             if(edge[i].c<flow)
71                 flow=edge[i].c;
72         for(int i=pre[end];i!=-1;i=pre[edge[i].u]){
73             edge[i].c-=flow;
74             edge[i^1].c+=flow;
75         }
76         ans+=dist[end];
77         flow_sum += flow;
78     }
79     //cout << flow_sum << endl;
80     return ans;
81 }
82 
83 int main()
84 {
85     //freopen("in.txt","r",stdin);
86     int n,m,a,b,c;
87     while(scanf("%d%d",&n,&m)!=EOF){
88         init();
89         addedge(0,1,2,0);
90         addedge(n,n+1,2,0);
91         for(int i=1;i<=m;i++){
92             scanf("%d%d%d",&a,&b,&c);
93             addedge(a,b,1,c);
94             addedge(b,a,1,c);
95         }
96         printf("%d
",MCMF(0,n+1));
97     }
98     return 0;
99 }
View Code
原文地址:https://www.cnblogs.com/macinchang/p/4507136.html