POJ3696 The Windy's 【网络流】

 


 


#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
#define N 10010
struct Edge{
    int u,v,cap,flow,cost;
    Edge(int xu,int xv,int xcap,int xflow,int xcost){
        u=xu;v=xv;cap=xcap;flow=xflow;cost=xcost;
    }
};
struct MCMF{
    int s,t;
    int d[N],f[N],p[N];
    bool inq[N];
    vector<Edge> E;
    vector<int> G[N];
    void clear(){
        E.clear();
        for(int i=0;i<N;i++)G[i].clear();
    }
    void add(int u,int v,int cap,int cost){
        Edge w1(u,v,cap,0,cost);
        Edge w2(v,u,0,0,-cost);
        E.push_back(w1);
        E.push_back(w2);
        int m=E.size();
        G[u].push_back(m-2);
        G[v].push_back(m-1);
    }
    bool SPFA(int &flow,int &cost){
        memset(inq,0,sizeof(inq));
        memset(d,0x3f,sizeof(d));
        queue<int> Q;
        Q.push(s);
        d[s]=0;f[s]=INF;
        while(!Q.empty()){
            int u=Q.front();Q.pop();inq[u]=0;
            for(int i=0;i<G[u].size();i++){
                Edge e=E[G[u][i]];
                if(e.cap>e.flow&&d[e.v]>d[u]+e.cost){
                    d[e.v]=d[u]+e.cost;
                    p[e.v]=G[u][i];
                    f[e.v]=min(f[u],e.cap-e.flow);
                    if(!inq[e.v]){
                        Q.push(e.v);
                        inq[e.v]=1;
                    }
                }
            }
        }
        if(d[t]==INF)return false;
        flow+=f[t];cost+=f[t]*d[t];
        int u=t;
        while(u!=s){
            E[p[u]].flow+=f[t];
            E[p[u]^1].flow-=f[t];
            u=E[p[u]].u;
        }
        return true;
    }
    int Min_cost_Max_flow(){
        int flow=0,cost=0;
        while(SPFA(flow,cost));
        return cost;
    }
}mcmf;
int n,m,a[100];
int main(){
    int T;scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        mcmf.clear();
        mcmf.s=0;
        mcmf.t=n+n*m+1;
        for(int i=1;i<=n;i++){
            mcmf.add(0,i,1,0);
            for(int j=1;j<=m;j++){
                int p;scanf("%d",&p);
                for(int k=1;k<=n;k++)
                    mcmf.add(i,j*n+k,1,k*p);
            }
        }
        for(int i=n+1;i<=n*m+n;i++)mcmf.add(i,n*m+n+1,1,0);
        printf("%.6lf\n",mcmf.Min_cost_Max_flow()*1.0/n);
    }
    return 0;
}
posted @ 2018-05-22 23:06  Dream_maker_yk  阅读(93)  评论(0编辑  收藏  举报