1,定义:

1,最大权闭合子图是最小割的一个模型。即每一个子图中的每一个点,其出边的点也全应该在这个子图中。而所有子图中,其点的权值和最大就是最大权闭合子图。

2,构建该图,我们把所有正权值点与源点s连接(其边权为点权),所有负权值点有汇点t连接(其边权为负点权(即改为正数)),而点与点之间的边都是INF的边。这样,我们的最小割一定割的是连接s或者t的边(最小割不会割INF边的)。

3,我们说过,点的出边一定要与点在同一个子图中,所以建立点与点之间的关系(如a->b,a->c),其关系为走a必须同时走b和c。

4,我们把所有正权值点加起来为sum,而我们走最小割时,就等于舍弃这个正权值边或者走了这个负权值边。

即最大权闭合子图答案为sum-最小割。

证明如图:

例题:Gold Mine

题意(读起来有点坑,翻译一下)

有t个测试,每个测试第一个输入n,表示有n个区域有金矿。

接下来对n个金矿进行描述,首先输入h,表示这个金矿有h个金块。

接下来对h个金块描述,首先是a1,a2,w表示挖这个金块的代价,挖这个金块获得的价值,挖这个金块前必须先挖掉前面w个金块才可以。

接下来对w个金块描述,每行输入x1,x2,表示这个金块在x1行,x2列。

思路:

就是裸题.......

我用的isap算法最大流三大算法——3,ISAP算法

#include <bits/stdc++.h>
using namespace std;
#define ll     long long
#define int ll
typedef unsigned long long ull;
typedef pair<long long, long long> pll;
typedef pair<int, int> pii;//double 型memset最大127,最小128
//std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF
const int M = 5e4 + 10;
const int N = 3e3 + 10;int head[M], gap[N], dep[N], now[M];
int num, ans, s, t, cnt;
struct node
{int next, to, w;
} edge[M];void add(int u, int v, int w)
{edge[++num].next = head[u];edge[num].to = v;edge[num].w = w;head[u] = num;edge[++num].next = head[v];edge[num].to = u;edge[num].w = 0;head[v] = num;
}void init()
{memset(head, 0, sizeof(head));memset(dep, -1, sizeof(head));memset(gap, 0, sizeof(gap));num = 1;ans = cnt = 0;
}void bfs()
{queue<int>q;dep[t] = 0;gap[0]++;q.push(t);while (!q.empty()){int u = q.front();q.pop();for (int i = head[u]; i; i = edge[i].next){int v = edge[i].to, w = edge[i ^ 1].w;if (dep[v] == -1 && w){dep[v] = dep[u] + 1;gap[dep[v]]++;q.push(v);}}}
}ll dfs(int u, ll sum)
{if (u == t)return sum;int k, res = 0;for (int i = now[u]; i && sum; i = edge[i].next){now[u] = i;int v = edge[i].to, w = edge[i].w;if (dep[v] == dep[u] - 1 && w){k = dfs(v, min(sum, w));if (!k)continue;edge[i].w -= k;edge[i ^ 1].w += k;res += k;sum -= k;if (!sum)return res;}}gap[dep[u]]--;if (!gap[dep[u]])dep[s] = cnt + 2;dep[u]++;gap[dep[u]]++;return res;
}void msolve()
{init();int n, h, a1, a2, w, sum = 0;cin >> n;s = 0, t = 25 * n + 1;for (int i = 0; i < n; ++i){cin >> h;for (int j = 1; j <= h; ++j){cnt++;int u = i * 25 + j;cin >> a1 >> a2 >> w;int a = a2 - a1;if (a > 0)add(s, u, a), sum += a;//正权值点连接s,负权值点连接telse add(u, t, -a);for (int k = 1; k <= w; ++k){cin >> a1 >> a2;add(u, (a1 - 1) * 25 + a2, llINF);//点与点之间边是INF}}}//isap算法bfs();while (dep[s] < cnt + 2 && dep[s] != -1){memcpy(now, head, sizeof(head));ans += dfs(s, llINF);}cout << sum - ans << endl;
}int32_t main()
{std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int t;cin >> t;for (int i = 1; i <= t; ++i){cout << "Case #" << i << ": ";msolve();}return 0;
}

最大权闭合子图(最小割模型)相关推荐

  1. 最大权闭合子图(最小割)

    最大权闭合子图(最大流最小割) •参考资料 [1]最大权闭合子图 •权闭合子图 存在一个图的子图,使得子图中的所有点出度指向的点依旧在这个子图内,则此子图是闭合子图. 在这个图中有8个闭合子图:∅,{ ...

  2. [笔记] 最大权闭合子图最大流最小割相关笔记

    最大权闭合子图 对于最大权闭合子图的理论学习并且补充一部分网络流的笔记 有向图中若干个点组成的一个集合\(V\),集合\(V\)的所有出边所连的点也都属于\(V\),这些点构成的图即为闭合子图 点有点 ...

  3. p2762-太空飞行计划问题【网络流,最大权闭合图,最小割】

    正题 AC评测记录链接: https://www.luogu.org/record/show?rid=7965757 大意 有nnn个实验,有m" role="presentati ...

  4. 【BZOJ】1497: [NOI2006]最大获利 最大权闭合子图或最小割

    [题意]给定n个点,点权为pi.m条边,边权为ci.选择一个点集的收益是在[点集中的边权和]-[点集点权和],求最大获利.n<=5000,m<=50000,0<=ci,pi<= ...

  5. CF1082G Petya and Graph(最小割,最大权闭合子图)

    QWQ嘤嘤嘤 感觉是最水的一道\(G\)题了 顺便记录一下第一次在考场上做出来G qwqqq 题目大意就是说: 给你n个点,m条边,让你选出来一些边,最大化边权减点权 \(n\le 1000\) QW ...

  6. 洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图

    第一次做最小割,不是很理解. https://www.luogu.org/problemnew/show/P1361 要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点 ...

  7. 图论 —— 网络流 —— 最小割 —— 最大权闭合子图

    [概述] 给出一个有向图,每一个点都有一个权值,现在要选择一个权值和最大的子图,使得每个点的后继都在子图中,这个子图就称为最大权闭合子图. 如上图,能选的子图有:Ø.{1,2,3,4,5,6}.{3, ...

  8. 洛谷 p4174 [noi2006] 最大获利 最小割(最大流),最大权闭合子图

    题目 题解 题目 洛谷 p4174 建站花费p[i]元,如果a,b两个站都建起来了获利c元,问最大的获利. 题解 首先需要理解最大流求最大权闭合子图,这个我也不说了,又是转载博客. https://b ...

  9. hdu 3879(最小割模型求解最大权闭合图)

    题意: 公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第i个通讯中转站需要 ...

最新文章

  1. 怎样看待大学期间的代码练习
  2. YUM(Yellow gog Updater Modifie)服务器的配置
  3. cf round #421 div2 D. Mister B and PR Shifts
  4. python popen函数讲解_Python常用模块函数代码汇总解析
  5. Redis与RabbitMQ作为消息队列的比较
  6. IOS约束三个按钮等宽等高,均分整个view,
  7. 网站主机和服务器选哪个,虚拟主机和服务器 你的网站该选择哪一个?
  8. 跟我一起学Redis之Redis配置文件啃了一遍之后,从尴尬变得有底气了(总结了一张思维图)...
  9. python基本词汇的特点_开课吧老师为你讲解 Python都有什么优点?
  10. tensorflow tensorboard summary的工作特点
  11. 方维出现 Fatal error: Class 'Session' not found
  12. 凸优化第五章对偶 作业题
  13. 拓端tecdat|R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型
  14. Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx
  15. 20HZ信号发生器电路图
  16. c语言输入若干学生成绩 计算平均,从键盘输入若干名学生的成绩,当输入-1时结束,统计出及格人数...
  17. XP系统清理优化工具箱
  18. Android主题色设为透明
  19. 虚拟机(VM)与JVM
  20. JS 小写数字格式转大写格式

热门文章

  1. 硬件测试工具(转东转西)
  2. Vue页面功能设计:随机生成一句名言或者励志的话
  3. 公园无线广播系统方案
  4. Python + selenium + requests实现12306全自动买票
  5. 翻录cda文件_翻录电视连续剧DVD并转换为单独的H.264 MP4文件
  6. LeetCode刷题——消除游戏#390#Medium
  7. 【转】如何确定我的测试用例覆盖全面-测试面试题
  8. 影像测量仪全自动测量汽车零件尺寸细节,保证整车品质和性能
  9. unity mono 编译
  10. 计算机软考 零基础,零基础计算机软考攻略