码迷,mamicode.com
首页 > 其他好文 > 详细

最小费用最大流

时间:2014-09-02 22:44:35      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   ar   for   art   

Farm Tour http://poj.org/problem?id=2135

建图再说吧

bubuko.com,布布扣
  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cstdlib>
  4 #include<cmath>
  5 #include<map>
  6 #include<stack>
  7 #include<queue>
  8 #include<vector>
  9 #include<iostream>
 10 #include<algorithm>
 11 #define mt(a,b) memset(a,b,sizeof(a))
 12 using namespace std;
 13 const int inf=0x3f3f3f3f;
 14 class MaxFlowMinCost{///最小费用最大流 o(ME)
 15     typedef int typef;///流量的类型
 16     typedef int typec;///费用的类型
 17     static const int ME=100010;///边的个数
 18     static const int MV=1010;///点的个数
 19     queue<int> q;
 20     int cur[MV],pre[MV];
 21     bool used[MV],sign[MV];
 22     typef flow;
 23     typec cost,dist[MV];
 24     bool spfa(int s,int t) {
 25         mt(used,0);
 26         mt(sign,0);
 27         mt(dist,0);
 28         used[s]=sign[s]=true;
 29         while(!q.empty()) q.pop();
 30         q.push(s);
 31         while(!q.empty()) {
 32             int u=q.front();
 33             q.pop();
 34             used[u]=false;
 35             for(int i=g.head[u]; ~i; i=g.e[i].next) {
 36                 if(g.e[i].flow<1) continue;
 37                 int v=g.e[i].v;
 38                 typec c=g.e[i].cost;
 39                 if(!sign[v]||dist[v]>dist[u]+c) {
 40                     dist[v]=dist[u]+c;
 41                     sign[v]=true;
 42                     pre[v]=u;
 43                     cur[v]=i;
 44                     if(used[v]) continue;
 45                     used[v]=true;
 46                     q.push(v);
 47                 }
 48             }
 49         }
 50         return sign[t];
 51     }
 52     struct G{
 53         struct E{
 54             int v,next;
 55             typef flow;
 56             typec cost;
 57         }e[ME];
 58         int le,head[MV];
 59         void init(){
 60             le=0;
 61             mt(head,-1);
 62         }
 63         void add(int u,int v,typef flow,typec cost){
 64             e[le].v=v;
 65             e[le].flow=flow;
 66             e[le].cost=cost;
 67             e[le].next=head[u];
 68             head[u]=le++;
 69         }
 70     }g;
 71 public:
 72     void init(){
 73         g.init();
 74     }
 75     void add(int u,int v,typef flow,typec cost){
 76         g.add(u,v,flow,cost);
 77         g.add(v,u,0,-cost);
 78     }
 79     void solve(int s,int t) {
 80         flow=cost=0;
 81         while(spfa(s,t)) {
 82             int temp=t;
 83             typef now=inf;
 84             while(temp!=s) {
 85                 now=min(now,g.e[cur[temp]].flow);
 86                 temp=pre[temp];
 87             }
 88             flow+=now;
 89             temp=t;
 90             while(temp!=s) {
 91                 int id=cur[temp];
 92                 cost+=now*g.e[id].cost;
 93                 g.e[id].flow-=now;
 94                 g.e[id^1].flow+=now;
 95                 temp=pre[temp];
 96             }
 97         }
 98     }
 99     typef getflow(){
100         return flow;
101     }
102     typec getcost(){
103         return cost;
104     }
105 }graph;
106 int n,m;
107 int main()
108 {
109     while(~scanf("%d%d",&n,&m))
110     {
111         graph.init();
112         int s=0;
113         int t=n+1;
114         graph.add(s,1,2,0);
115         graph.add(n,t,2,0);
116         for(int i=0;i<m;i++)
117         {
118             int a,b,c;
119             scanf("%d%d%d",&a,&b,&c);
120             graph.add(a,b,1,c);
121             graph.add(b,a,1,c);
122         }
123         graph.solve(s,t);
124         int ans=graph.getcost();
125         printf("%d\n",ans);
126     }
127     return 0;
128 }
View Code

 

 

end

最小费用最大流

标签:style   blog   http   color   os   io   ar   for   art   

原文地址:http://www.cnblogs.com/gaolzzxin/p/3952365.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!