【题意】

有n个有偿工作选做,m个机器,完成一个工作需要若干个工序,完成每个工序需要一个机器,对于一个机器,在不同的工序有不同的租费,但买下来的费用只有一个。问最大获益。

【思路】

对于工作和机器建点,由S向每一个工作连边(S,u,a)a为完成工作的奖励,由一个工作向所需机器连边(u,v,b)b为租用机器费用,由每个机器向T连边(v,T,c)c为购买机器的费用。

  求最小割,构图提供的选择有:不做该工作,租用一个工序需要的机器,购买一个机器满足所有需要。最小割保证ST不相连,即保证给所有工作分配了一种方案:完成所有工序或不做该工作,且该方案花费最少,最小割即为最小亏损。

【代码】

 #include<set>
 #include<cmath>
 #include<queue>
 #include<vector>
 #include<cstdio>
 #include<cstring>
 #include<iostream>
 #include<algorithm>
 #define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
 #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
 using namespace std;

 typedef long long ll;
 ;
 const int inf = 1e9;

 ll read() {
     char c=getchar();
     ll f=,x=;
     while(!isdigit(c)) {
         ; c=getchar();
     }
     while(isdigit(c))
         x=x*+c-',c=getchar();
     return x*f;
 }

 struct Edge {
     int u,v,cap,flow;
 };
 struct Dinic {
     int n,m,s,t;
     int d[N],cur[N],vis[N];
     vector<int> g[N];
     vector<Edge> es;
     queue<int> q;
     void init(int n) {
         this->n=n;
         es.clear();
         FOR(i,,n) g[i].clear();
     }
     void AddEdge(int u,int v,int w) {
         es.push_back((Edge){u,v,w,});
         es.push_back((Edge){v,u,,});
         m=es.size();
         g[u].push_back(m-);
         g[v].push_back(m-);
     }
     int bfs() {
         memset(vis,,sizeof(vis));
         q.push(s); d[s]=; vis[s]=;
         while(!q.empty()) {
             int u=q.front(); q.pop();
             FOR(i,,() {
                 Edge& e=es[g[u][i]];
                 int v=e.v;
                 if(!vis[v]&&e.cap>e.flow) {
                     vis[v]=;
                     d[v]=d[u]+;
                     q.push(v);
                 }
             }
         }
         return vis[t];
     }
     int dfs(int u,int a) {
         if(u==t||!a) return a;
         ,f;
         for(int& i=cur[u];i<g[u].size();i++) {
             Edge& e=es[g[u][i]];
             int v=e.v;
             &&(f=dfs(v,min(a,e.cap-e.flow)))>) {
                 e.flow+=f;
                 es[g[u][i]^].flow-=f;
                 flow+=f; a-=f;
                 if(!a) break;
             }
         }
         return flow;
     }
     int MaxFlow(int s,int t) {
         this->s=s,this->t=t;
         ;
         while(bfs()) {
             memset(cur,,sizeof(cur));
             flow+=dfs(s,inf);
         }
         return flow;
     }
 } dc;

 int n,m,S,T;

 int main()
 {
     n=read(),m=read();
     dc.init(n+m+);
     ,T=n+m+;
     ;
     FOR(i,,n) {
         int a=read(),b=read();
         ans+=a;
         dc.AddEdge(S,i,a);
         FOR(j,,b) {
             int x=read(),y=read();
             dc.AddEdge(i,x+n,y);
         }
     }
     FOR(i,,m) {
         int x=read();
         dc.AddEdge(n+i,T,x);
     }
     printf("%d",ans-dc.MaxFlow(S,T));
     ;
 }

bzoj 1391 [Ceoi2008]order(最小割)的更多相关文章

  1. BZOJ 1391: [Ceoi2008]order [最小割]

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1509  Solved: 460[Submit][Statu ...

  2. BZOJ 1391 [Ceoi2008]order

    1391: [Ceoi2008]order Description 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完 ...

  3. Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1105  Solved: 331[Submit][Statu ...

  4. [CEOI2008]order --- 最小割

    [CEOI2008]order 题目描述: 有N个任务,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数, ...

  5. P4177 [CEOI2008]order 最小割

    \(\color{#0066ff}{ 题目描述 }\) 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给 ...

  6. 【BZOJ-1391】order 最小割 + 最大全闭合图

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1334  Solved: 405[Submit][Statu ...

  7. [BZOJ 2127] happiness 【最小割】

    题目链接:BZOJ - 2127 题目分析 首先,每个人要么学文科,要么学理科,所以可以想到是一个最小割模型. 我们就确定一个人如果和 S 相连就是学文,如果和 T 相连就是学理. 那么我们再来确定建 ...

  8. BZOJ.3532.[SDOI2014]LIS(最小割ISAP 退流)

    BZOJ 洛谷 \(LIS\)..经典模型? 令\(f_i\)表示以\(i\)结尾的\(LIS\)长度. 如果\(f_i=1\),连边\((S,i,INF)\):如果\(f_i=\max\limits ...

  9. BZOJ 2561 最小生成树 | 网络流 最小割

    链接 BZOJ 2561 题解 用Kruskal算法的思路来考虑,边(u, v, L)可能出现在最小生成树上,就是说对于所有边权小于L的边,u和v不能连通,即求最小割: 对于最大生成树的情况也一样.容 ...

随机推荐

  1. 介绍两个挺好用的基于Jquery的上传工具

    一.ajaxFileUpload 二.fineUploader

  2. 一文说尽C++赋值运算符重载函数(operator=)

    写在前面: 关于C++的赋值运算符重载函数(operator=),网络以及各种教材上都有很多介绍,但可惜的是,内容大多雷同且不全面.面对这一局面,在下在整合各种资源及融入个人理解的基础上,整理出一篇较 ...

  3. 模板:函数memset

    需要的头文件 <memory.h> or <string.h> memset   函数介绍 void *memset(void *s, int ch, size_t n); 函 ...

  4. zTree判断是否为父节点

    var treeObj = $.fn.zTree.getZTreeObj("tree"); var nodes = treeObj.getSelectedNodes(); if(t ...

  5. Ganglia监控搭建

    一.Ganglia介绍: Ganglia是一个监控服务器.集群的开源软件,能够用曲线图表现最近一个小时,最近一天,最近一周,最近一月,最近一年的服务器或者集群的cpu负载,内存,网络,硬盘等指标.Ga ...

  6. [HDU] 2063 过山车(二分图最大匹配)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2063 女生为X集合,男生为Y集合,求二分图最大匹配数即可. #include<cstdio> ...

  7. [原创] linux 下上传 datapoint数据到yeelink 【golang版本】同时上传2个数据点

    /* Create by sndnvaps<sndnvaps@gmail.com> * data: 2015-04-12* upload 2 datapoint to yeelink.ne ...

  8. C#窗口传值(CSDN实例)

    //非模式窗体  相较独立From qform=new Form();       qform.Show(); //模式窗体  子依赖父Form qform=new Form();qform.Show ...

  9. fidller判断只抓固定host

    设置好,填入对应的host,操作-立即运行过滤设置 效果

  10. 【Linux】Mac PD set centos static ip

    2,修改Centos的网络设置. (1)进入脚本. vi /etc/sysconfig/network-scripts/ifcfg-eth0 My Mac ip: # 从dhcp改成static BO ...