zoukankan      html  css  js  c++  java
  • 最小费用最大流

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

    建图再说吧

      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
    ",ans);
    126     }
    127     return 0;
    128 }
    View Code

    end

  • 相关阅读:
    linux下文件的复制、移动与删除
    Hbase万亿级存储性能优化总结-配置
    hbase 读写和优化
    hive数据倾斜定位及处理
    flink初识及安装flink standalone集群
    【Linux】用less查看日志文件
    sqoop的详细使用及原理
    HBase删除数据的原理
    hbase数据加盐(Salting)存储与协处理器查询数据的方法
    Hbase内存磁盘大致关系
  • 原文地址:https://www.cnblogs.com/gaolzzxin/p/3952365.html
Copyright © 2011-2022 走看看