zoukankan      html  css  js  c++  java
  • [poj3686]The Windy's(费用流)

    题目大意:

    解题关键:指派问题,待更。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<iostream>
    #include<cmath>
    #include<vector>
    #include<queue>
    #define inf 0x3f3f3f3f
    #define MAX_V 10010
    using namespace std;
    typedef long long ll;
    typedef pair<int,int>P;
    struct edge{int to,cap,cost,rev;};
    int V;
    vector<edge>G[MAX_V];
    int h[MAX_V],dist[MAX_V],prevv[MAX_V],preve[MAX_V];
    void add_edge(int from,int to,int cap,int cost){
        G[from].push_back((edge){to,cap,cost,G[to].size()});
        G[to].push_back((edge){from,0,-cost,G[from].size()-1});
    }
    
    int min_cost_flow(int s,int t,int f){
        int res=0;
        fill(h,h+V,0);
        while(f>0){
            priority_queue<P,vector<P>,greater<P> >que;
            fill(dist,dist+V+1,inf);
            dist[s]=0;
            que.push(P(0,s));
            while(!que.empty()){
                P p=que.top();que.pop();
                int v=p.second;
                if(dist[v]<p.first) continue;
                for(int i=0;i<G[v].size();i++){
                    edge &e=G[v][i];
                    if(e.cap>0&&dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]){
                        dist[e.to]=dist[v]+e.cost+h[v]-h[e.to];
                        prevv[e.to]=v;
                        preve[e.to]=i;
                        que.push(P(dist[e.to],e.to));
                    }
                }
            }
            if(dist[t]==inf) return -1;
            for(int v=0;v<V;v++) h[v]+=dist[v];
            
            //增广 
            int d=f;
            for(int v=t;v!=s;v=prevv[v]) d=min(d,G[prevv[v]][preve[v]].cap);
            f-=d;
            res+=d*h[t];
            for(int v=t;v!=s;v=prevv[v]){
                edge &e=G[prevv[v]][preve[v]];
                e.cap-=d;
                G[v][e.rev].cap+=d; 
            }
        }
        return res;
    }
    int n,m,t1,t2,t3,t4;
    int z[100][100];
    int main(){
        int _;
        scanf("%d",&_);
        while(_--){
            memset(G,0,sizeof G);
            scanf("%d%d",&n,&m);
            for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    scanf("%d",&z[i][j]);
                }
            }
            int s=n+n*m,t=s+1;
            V=t+1;
            for(int i=0;i<n;i++) add_edge(s,i,1,0); 
            for(int j=0;j<m;j++){
                for(int k=0;k<n;k++){
                    add_edge(n+j*n+k,t,1,0);
                    for(int i=0;i<n;i++){
                        add_edge(i,n+j*n+k,1,(k+1)*z[i][j]);
                    }
                }
            }
            printf("%.6f
    ",(double)min_cost_flow(s,t,n)/n);
        }
        return 0;
    } 
  • 相关阅读:
    左孩子右兄弟的字典树
    UVA 1401 Remember the Word
    HDOJ 4770 Lights Against Dudely
    UvaLA 3938 "Ray, Pass me the dishes!"
    UVA
    Codeforces 215A A.Sereja and Coat Rack
    Codeforces 215B B.Sereja and Suffixes
    HDU 4788 Hard Disk Drive
    HDU 2095 find your present (2)
    图的连通性问题—学习笔记
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/7910647.html
Copyright © 2011-2022 走看看