• [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;
    } 
  • 相关阅读:
    13.困难重重
    02.Django的第一个网页
    03.Django模板
    01.Web开发之简介
    14.效率利器之多线程和线程池
    Silverlight实用窍门系列:37.Silverlight和ASP.NET相互传参的两种常用方式(QueryString,Cookie)
    Web编码规范中文乱码解决方案
    H*ber*ate Lazy属性
    Bat如何判断txt文本中第8行是否只有"符号,有则删除整行
    #每日一练 获取字典值
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/7910647.html
Copyright © 2020-2023  润新知