zoukankan      html  css  js  c++  java
  • 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
    ",mcmf.Min_cost_Max_flow()*1.0/n);
        }
        return 0;
    }
  • 相关阅读:
    linux 网络编程比较好的文章
    linux 命令
    感冒了
    aa
    111
    仿京东(我的商城)鼠标上去弹出层效果
    仿汽车之家搜索页价格签区间(鼠标拖拽同时tip提示)
    关于DW 打不开后缀名为.ftl的文件 配置方法
    客户端与服务器段的交互 通过json
    jquery 阻止事件冒泡
  • 原文地址:https://www.cnblogs.com/dream-maker-yk/p/9676405.html
Copyright © 2011-2022 走看看