【题意】

有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. SQL Server监控报警架构_如何添加报警

    一.数据库邮件报警介绍 数据库邮件是从SQL Server数据库引擎发送电子邮件企业解决方案,使用简单传输协议(SMTP)发送邮件.发送邮件进程与数据库的进程隔离,因此可不用担心影响数据库服务器. 数 ...

  2. some code of c

    // // main.c // LineList // // Created by Rubert on 16/9/11. // Copyright © 2016年 Study. All rights ...

  3. Knockout.Js案例二Working With Lists And Collections

    案例一:Foreach绑定 通常,您要生成重复的UI元素,特别是当显示列表,用户可以添加和删除元素.KO.JS让你轻松,使用的数组和foreach绑定. 在接下来的几分钟,您将构建一个动态UI保留席位 ...

  4. 了解Git

           对于计算机软件初学者来说Git并没有太多了解, 以前没有接触过,但是老师说对其进行了解,也没有什么概念,只有通过上网进行了解 . 了解到的大概内容如下:                 ...

  5. 动态规划入门——Eddy&#39;s research II

    转载请注明出处:http://blog.csdn.net/a1dark 分析:找规律 #include<stdio.h> int main(){ int m,n; while(scanf( ...

  6. RedHat7搭建Nginx+Apache+PHP

    Nginx做为前端服务器(本机IP:192.168.136.104),将访问PHP页面的动态请求转发给Apache服务器(只监听本地回环地址172.0.0.1:80) 安装Apache# yum -y ...

  7. ALTIUM DESIGNER怎么定义差分对布线

    方法一:第一步是在原理图中声明,这样做的目的是为了让差分对布线器清楚哪两个网络是属于同一组差分对,设计编译器将查找格式为NETNAME_N和NETNAME_P(即以_N和_P为后缀)的两个同名网络.这 ...

  8. Zookeeper单机安装部署与配置(二)

    在上篇博客中简单介绍了Zookeeper的特点和应用场景,详情可参考:<Zookeeper简介(一)>,那么这篇博客我们介绍一下关于Zookeeper的单机模式安装步骤与配置. 环境准备 ...

  9. 解决VS2013 git客户端遇到的一些问题

    分支问题 我在网上的托管环境(github)新建项目的时候有生成readme文件.在本地初始化项目添加git作为项目管理时,填写远程地址一定要以https形式,然后发布会出错,提示 在git命令行好像 ...

  10. POJ-1459 Power Network(最大流)

    https://vjudge.net/problem/POJ-1459 题解转载自:優YoU http://user.qzone.qq.com/289065406/blog/1299339754 解题 ...