题意:n个实验 每个实验可获利ai元 做每个实验需要几个仪器

   购买每个仪器有不同的花费 不同实验可能会用到同一个仪器 只用购买一次 求最大收益

题解:............................................

   先讲玄学建图吧

   从s向每个实验连权值为仪器收益的边

   从每个仪器向t连权值仪器花费的边

   实验与仪器之间连INF的边

   答案等于所有实验的收益 减去 (最大流=最小割)

   感性的理解一下.. 你已经获得了实验的收益了 如果当前存在一条s->t的路径 那么就表示你这个实验 还欠缺着某个仪器没买

   因为把仪器割掉的含义是买这个仪器 所以才会减去花费

   如果把实验割掉了 那么显然就是不做这个实验

   然后输出方案也学到一个trick 就是在最后一次bfs的时候 如果当前点跑不到 dis = INF 那么意味着到这个点的边权被减为0了 流满了 就是这个点被割掉了

   在这个题里被割掉了就意味着 选择做实验 买仪器

#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f; int n, m, s, t, maxflow, cnt;
struct node {
int to, nex, val;
}E[100005];
int head[105];
int cur[105]; void addedge(int x, int y, int va) {
E[++cnt].to = y; E[cnt].nex = head[x]; head[x] = cnt; E[cnt].val = va;
E[++cnt].to = x; E[cnt].nex = head[y]; head[y] = cnt; E[cnt].val = 0;
} int dep[105];
int inque[105];
bool bfs() {
for(int i = 1; i <= t; i++) dep[i] = INF, inque[i] = 0, cur[i] = head[i];
queue<int> que;
que.push(s);
dep[s] = 0, inque[s] = 1; while(!que.empty()) {
int u = que.front();
que.pop();
inque[u] = 0; for(int i = head[u]; i; i = E[i].nex) {
int v = E[i].to;
if(E[i].val && dep[v] > dep[u] + 1) {
dep[v] = dep[u] + 1;
if(!inque[v]) {
que.push(v);
inque[v] = 1;
}
}
}
}
return dep[t] != INF;
} int vis;
int dfs(int x, int flow) {
if(x == t) {
maxflow += flow;
vis = 1;
return flow;
} int rflow = 0;
int used = 0;
for(int i = cur[x]; i; i = E[i].nex) {
cur[x] = i;
int v = E[i].to;
if(E[i].val && dep[v] == dep[x] + 1) {
if(rflow = dfs(v, min(flow - used, E[i].val))) {
used += rflow;
E[i].val -= rflow;
E[i ^ 1].val += rflow;
if(used == flow) break;
}
}
}
return used;
} void dinic() {
maxflow = 0;
while(bfs()) {
vis = 1;
while(vis) {
vis = 0;
dfs(s, INF);
}
}
} int p[55];
int c[55];
int ans[55];
int viss[55];
int ned[55][55];
char tools[10000]; int main() {
int sum = 0;
scanf("%d%d", &n, &m);
s = n + m + 1;
t = s + 1;
cnt = 1;
int ulen; for(int i = 1; i <= n; i++) {
scanf("%d", &p[i]);
sum += p[i];
addedge(s, i, p[i]); memset(tools, 0, sizeof(tools));
cin.getline(tools, 10000);
ulen = 0;
int num;
while(sscanf(tools + ulen, "%d", &num) == 1) {
ned[i][num] = 1;
addedge(i, n + num, INF); if(num == 0) ulen++;
else {
while(num) {
num /= 10;
ulen++;
}
}
ulen++;
} }
for(int i = 1; i <= m; i++) scanf("%d", &c[i]);
for(int i = 1; i <= m; i++) addedge(n + i, t, c[i]);
dinic(); for(int i = 1; i <= m; i++) {
for(int j = head[i + n]; j; j = E[j].nex) {
int v = E[j].to;
if(v == t) {
if(E[j].val == 0) viss[i] = 1;
break;
}
}
} for(int i = 1; i <= n; i++) {
if(dep[i] != INF) printf("%d ", i);
}
puts(""); for(int i = 1; i <= m; i++) {
if(dep[i + n] != INF) printf("%d ", i);
}
puts("");
printf("%d\n", sum - maxflow);
return 0;
}

  

P2762 太空飞行计划问题 (最小割)的更多相关文章

  1. 洛谷 - P2762 - 太空飞行计划问题 - 最小割

    https://www.luogu.org/problemnew/solution/P2762 最小割对应的点,在最后一次更新中dinic的bfs会把他的dep重置掉.所以可以根据这个性质复原最小割. ...

  2. P2762 [网络流24题]太空飞行计划问题(最小割)

    地址 最大权闭合子图裸题,不说了吧,求方案就是把s集遍历一遍. 错误记录:dfs那块忘判断残量了,11分×1. #include<cstdio> #include<iostream& ...

  3. 洛谷 P2762 太空飞行计划问题 P3410 拍照【最大权闭合子图】题解+代码

    洛谷 P2762 太空飞行计划问题 P3410 拍照[最大权闭合子图]题解+代码 最大权闭合子图 定义: 如果对于一个点集合,其中任何一个点都不能到达此集合以外的点,这就叫做闭合子图.每个点都有一个权 ...

  4. 网络流24题:P2762 太空飞行计划问题

    P2762 太空飞行计划问题 题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,E ...

  5. 洛谷 P4174 [NOI2006]最大获利 && 洛谷 P2762 太空飞行计划问题 (最大权闭合子图 && 最小割输出任意一组方案)

    https://www.luogu.org/problemnew/show/P4174 最大权闭合子图的模板 每个通讯站建一个点,点权为-Pi:每个用户建一个点,点权为Ci,分别向Ai和Bi对应的点连 ...

  6. 洛谷P2762 太空飞行计划问题(最小割)

    传送门 我们可以把实验放在左边,仪器放在右边,点有点权,然后连对应的有向边,就是求一个最大权闭合图,可以转化为最小割来做(关于这具体是个啥……可以百度胡伯涛<最小割模型在信息学竞赛中的应用> ...

  7. P2762 太空飞行计划问题(网络流24题之一)

    题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的 ...

  8. P2762 太空飞行计划问题 网络流

    题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的 ...

  9. P2762 太空飞行计划问题 最大权闭合子图

    link:https://www.luogu.org/problemnew/show/P2762 题意 承担实验赚钱,但是要花去对应仪器的费用,仪器可能共用.求最大的收益和对应的选择方案. 思路 这道 ...

随机推荐

  1. Go GRPC 入门(一)

    前言 微服务相关 使用 GRPC 通讯的 Golang 微服务入门 举例写一个微服务,接收网址发送请求获取返回结果返回 正文 安装工具 安装 protobuf 这是 proto 文件的编译器 点我下载 ...

  2. python Logger模块单例模式

    前言 提前祝大家过个好年 最近忙于项目,今天抽出点时间写写Blog谈谈昨天遇到的问题 项目最近要收尾了,想把Logger规整一下,因为很多地方都有用到 Python的Logger模块是Python自带 ...

  3. 【C++】《Effective C++》第七章

    第七章 模板与泛型编程 条款41:了解隐式接口和编译期多态 面向对象设计中的类(class)考虑的是显式接口(explict interface)和运行时多态,而模板编程中的模板(template)考 ...

  4. pidof

    pidof 服务名称,就可以查看到服务占用的进程号

  5. D2Admin 登录用户重新初始话右侧菜单

    背景 最近用到D2Admin开发项目,用户登录菜单要根据用户角色权限获取,但是又不想用官网的方案(vue基于d2-admin的RBAC权限管理解决方案),所以自己加了个只修改 menuAside的方案 ...

  6. SAP中的F4帮助

    今天在调试标准程序的时候,意外的发现了一个F4帮助的函数,感觉还是挺好用的. F4IF_FIELD_VALUE_REQUEST从函数名就可以看出是给字段添加F4帮助的. F4 help for fie ...

  7. Zju1100 Mondriaan

    题目描述 有一个m行n列的矩阵,用1*2的骨牌(可横放或竖放)完全覆盖,骨牌不能重叠,有多少种不同的覆盖的方法? 你只需要求出覆盖方法总数mod p的值即可. 输入格式 三个整数数n,m,p,m< ...

  8. Java并发包源码学习系列:阻塞队列实现之PriorityBlockingQueue源码解析

    目录 PriorityBlockingQueue概述 类图结构及重要字段 什么是二叉堆 堆的基本操作 向上调整void up(int u) 向下调整void down(int u) 构造器 扩容方法t ...

  9. hive报错:Failed with exception java.io.IOException: rename for src path:

    在hive中,会有这样一种情形: 1.创建一个分区外部表A(比如A表有5个字段),并且向A表里指定的分区(比如20160928这个分区)里插入数据 2.发现A表缺少一些字段,因为存在元数据不实时更新的 ...

  10. Python Data Structure and Algorithms Tutorial

    Python - Algorithm Design - Tutorialspoint https://www.tutorialspoint.com/python_data_structure/pyth ...