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;
    } 
  • 相关阅读:
    swiper 增加一个鼠标移入分页器的小点后就切换展示图片
    css中的单冒号和双冒号 以及 伪类和伪元素
    pointer-events: none;元素永远不会成为鼠标事件的target
    jQuery off() 方法
    jQuery方法汇总
    vue 数组修改 页面无法刷新
    mysql error Code 1441:datetime function: datetime field overflow
    生命的意义
    删除镜像或容器
    nginx Redis 不能访问问题
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/7910647.html
Copyright © 2011-2022 走看看