POJ-2516(最小费用最大流+MCMF算法)
Minimum Cost
POJ-2516
- 题意就是有n个商家,有m个供货商,然后有k种商品,题目求的是满足商家的最小花费供货方式。
- 对于每个种类的商品k,建立一个超级源点和一个超级汇点。每个商家和源点连线,容量为需要的商品数,每个供货商和汇点连线,容量为可以提供的商品数。
- 然后对于商家和供货商之间的连线就是,容量为INF,而费用就是题目提供的费用信息。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const int N=220;
const int INF=0X3F3F3F3F;
int n,m,k;//n表示商家,m表示供应商(0-50),k表示种类(0-3)
int need[N][N];//需求
int provide[N][N];//供应
int volume[N];//表示第k个品的所有的提供数目
struct Edge {
    int from, to, cap, flow, cost;
};
struct MCMF {
    int n, m;
    vector<Edge> edges;
    vector<int> G[N];
    int d[N], inq[N], p[N], a[N];
    void init(int n) {
        this->n = n;
        for (int i = 0; i <= n; ++i) G[i].clear();
        edges.clear();
    }
    void AddEdge(int from, int to, int cap, int cost) {
        edges.push_back(Edge{from, to, cap, 0, cost});
        edges.push_back(Edge{to, from, 0, 0, -cost});
        m = edges.size();
        G[from].push_back(m-2); G[to].push_back(m-1);
    }
    bool spfa(int s, int t, int &flow, int &cost) {
        //M(inq, 0); M(d, INF);
        memset(inq,0,sizeof(inq));
        memset(d,INF,sizeof(d));
        d[s] = 0; inq[s] = 1; p[s] = 0; a[s] = INF;
        queue<int> q;
        q.push(s);
        while (!q.empty()) {
            int x = q.front(); q.pop();
            inq[x] = 0;
            for (int i = 0; i < G[x].size(); ++i) {
                Edge &e = edges[G[x][i]];
                if (d[e.to] > d[x] + e.cost && e.cap > e.flow) {
                    d[e.to] = d[x] + e.cost;
                    p[e.to] = G[x][i];
                    a[e.to] = min(a[x], e.cap-e.flow);
                    if (inq[e.to]) continue;
                    q.push(e.to); inq[e.to] = 1;
                }
            }
        }
        if (d[t] == INF) return false;
        flow += a[t];
        cost += d[t] * a[t];
        int u = t;
        while (u != s) {
            edges[p[u]].flow += a[t];
            edges[p[u]^1].flow -= a[t];
            u = edges[p[u]].from;
        }
        return true;
    }
    int Mincost(int s, int t) {
        int flow = 0, cost = 0;
        while (spfa(s, t, flow, cost));
        return cost;
    }
}solver;
int main(){
    while(cin>>n>>m>>k&&(n||m||k)){
        memset(volume,0,sizeof(volume));
        for(int i=1;i<=n;i++){
            for(int j=1;j<=k;j++){
                cin>>need[i][j];
            }
        }
        for(int i=1;i<=m;i++){
            for(int j=1;j<=k;j++){
                cin>>provide[i][j];
                volume[j]+=provide[i][j];
            }
        }
        bool flag=true;
        int cost=0;
        for(int s=1;s<=k;s++){
            int s1=0,t=n+m+1;
            solver.init(n+m+1);
            int volume1=0;
            for(int i=1;i<=n;i++){
                solver.AddEdge(s1,i,need[i][s],0);
                volume1+=need[i][s];
            }
            if(volume1>volume[s])
                flag=false;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    int co;
                    cin>>co;
                    solver.AddEdge(i,n+j,INF,co);
                }
            }
            for(int i=1;i<=m;i++){
                solver.AddEdge(i+n,t,provide[i][s],0);
            }
            if(flag){
                cost+=solver.Mincost(s1,t);
            }
        }
        if(flag)
            cout<<cost<<endl;
        else
        {
            cout<<-1<<endl;
        }
    }
    return 0;
}
POJ-2516(最小费用最大流+MCMF算法)的更多相关文章
- POJ 2516 最小费用最大流
		每一种货物都是独立的,分成k次最小费用最大流即可! 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E[pe[v]^ ... 
- POJ-2195(最小费用最大流+MCMF算法)
		Going Home POJ-2195 这题使用的是最小费用流的模板. 建模的时候我的方法出现错误,导致出现WA,根据网上的建图方法没错. 这里的建图方法是每次到相邻点的最大容量为INF,而花费为1, ... 
- poj 2195   最小费用最大流模板
		/*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ... 
- poj 3422(最小费用最大流)
		题目链接:http://poj.org/problem?id=3422 思路:求从起点到终点走k次获得的最大值,最小费用最大流的应用:将点权转化为边权,需要拆点,边容量为1,费用为该点的点权,表示该点 ... 
- 把人都送到房子里的最小花费--最小费用最大流MCMF
		题意:http://acm.hdu.edu.cn/showproblem.php?pid=1533 相邻的容量为inf,费用为1,S到m容量为1,费用为0 ,H到T容量为1,费用为0. 建图跑-最小费 ... 
- POJ - 2195   最小费用最大流
		题意:每个人到每个房子一一对应,费用为曼哈顿距离,求最小的费用 题解:单源点汇点最小费用最大流,每个人和房子对于建边 #include<map> #include<set> # ... 
- POJ 2135 最小费用最大流 入门题
		Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19207 Accepted: 7441 Descri ... 
- POJ 2195 - Going Home - [最小费用最大流][MCMF模板]
		题目链接:http://poj.org/problem?id=2195 Time Limit: 1000MS Memory Limit: 65536K Description On a grid ma ... 
- poj   2135最小费用最大流
		最小费用最大流问题是经济学和管理学中的一类典型问题.在一个网络中每段路径都有"容量"和"费用"两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择 ... 
随机推荐
- Codeforces Global Round 9  C. Element Extermination  (思维,栈)
			题意:有一个长度\(n\)的序列,如果\(a_{i}<a_{i+1}\),那么可以选择删除\(a_{i}\)或者\(a_{i+1}\),再继续操作,问是否能够将序列删到只剩一个元素. 题解:感觉 ... 
- 使VS开发的程序在Win7系统运行时自动提升权限
			软件开发时,总是会遇到在Win7系统上运行不起来或者异常的情况,这通常是用户的权限不够引起的. 下面提供一个可以使程序运行时,自动提升用户权限的方法. 1.右键点击启动项目,单击"属性&qu ... 
- Hexo-使用阿里iconfont图标
			Hexo-使用阿里iconfont图标 因为使用hexo搭建的博客中,大家并不懂都有什么图标,fa fa-xx就懵了,不知道都有什么. 首先,fa fa-xxx中的图标可以在 图标库 中寻找. (上面 ... 
- 字节笔试题 leetcode 69. x 的平方根
			更多精彩文章请关注公众号:TanLiuYi00 题目 解题思路 题目要求非负整数 x 的平方根,相当于求函数 y = √x 中 y 的值. 函数 y = √x 图像如下: 从上图中,可以看出函数是单 ... 
- centos7+腾讯云服务器搭建wordpress
			title: centos7+腾讯云服务器搭建wordpress date: 2020-03-04 categories: web tags: [wordpress] 分两部分:1.搭建LEMP环境 ... 
- HTTP1.0和HTTP1.1以及HTTP2.0的区别
			(1)连接方面 HTTP1.0使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象.每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个对象,严重影响客户机和服务器的性能. H ... 
- PicGo:搭建图床
			PicGo:搭建图床 PicGo 免费搭建个人图床工具PicGo: 支持Windows.MacOS 和 Linux 软件目前覆盖的图床有8个平台: SM.MS图床.腾讯云COS.GitHub图床.七牛 ... 
- MDK5生成BIn文件的方法
			配置MDK5 生成bin文件的 第一步:方法打开option for Target 第二步:选择 user 第三步:找到After Build/Rebuild 第四步:勾选run,点击文件选择小图标选 ... 
- Vue Learning Paths
			Vue Learning Paths Vue Expert refs https://vueschool.io/articles/vuejs-tutorials/exciting-new-featur ... 
- SDK & 埋点 & user behavior tracker
			SDK & 埋点 & user behavior tracker 同一个 SDK ,根据不同的应用市场, 分别进行统计分析 ? https://www.umeng.com/ user ... 
