最大权闭合子图(最小割模型)
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]最大权闭合子图 •权闭合子图 存在一个图的子图,使得子图中的所有点出度指向的点依旧在这个子图内,则此子图是闭合子图. 在这个图中有8个闭合子图:∅,{ ...
- [笔记] 最大权闭合子图最大流最小割相关笔记
最大权闭合子图 对于最大权闭合子图的理论学习并且补充一部分网络流的笔记 有向图中若干个点组成的一个集合\(V\),集合\(V\)的所有出边所连的点也都属于\(V\),这些点构成的图即为闭合子图 点有点 ...
- p2762-太空飞行计划问题【网络流,最大权闭合图,最小割】
正题 AC评测记录链接: https://www.luogu.org/record/show?rid=7965757 大意 有nnn个实验,有m" role="presentati ...
- 【BZOJ】1497: [NOI2006]最大获利 最大权闭合子图或最小割
[题意]给定n个点,点权为pi.m条边,边权为ci.选择一个点集的收益是在[点集中的边权和]-[点集点权和],求最大获利.n<=5000,m<=50000,0<=ci,pi<= ...
- CF1082G Petya and Graph(最小割,最大权闭合子图)
QWQ嘤嘤嘤 感觉是最水的一道\(G\)题了 顺便记录一下第一次在考场上做出来G qwqqq 题目大意就是说: 给你n个点,m条边,让你选出来一些边,最大化边权减点权 \(n\le 1000\) QW ...
- 洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图
第一次做最小割,不是很理解. https://www.luogu.org/problemnew/show/P1361 要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点 ...
- 图论 —— 网络流 —— 最小割 —— 最大权闭合子图
[概述] 给出一个有向图,每一个点都有一个权值,现在要选择一个权值和最大的子图,使得每个点的后继都在子图中,这个子图就称为最大权闭合子图. 如上图,能选的子图有:Ø.{1,2,3,4,5,6}.{3, ...
- 洛谷 p4174 [noi2006] 最大获利 最小割(最大流),最大权闭合子图
题目 题解 题目 洛谷 p4174 建站花费p[i]元,如果a,b两个站都建起来了获利c元,问最大的获利. 题解 首先需要理解最大流求最大权闭合子图,这个我也不说了,又是转载博客. https://b ...
- hdu 3879(最小割模型求解最大权闭合图)
题意: 公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第i个通讯中转站需要 ...
最新文章
- 怎样看待大学期间的代码练习
- YUM(Yellow gog Updater Modifie)服务器的配置
- cf round #421 div2 D. Mister B and PR Shifts
- python popen函数讲解_Python常用模块函数代码汇总解析
- Redis与RabbitMQ作为消息队列的比较
- IOS约束三个按钮等宽等高,均分整个view,
- 网站主机和服务器选哪个,虚拟主机和服务器 你的网站该选择哪一个?
- 跟我一起学Redis之Redis配置文件啃了一遍之后,从尴尬变得有底气了(总结了一张思维图)...
- python基本词汇的特点_开课吧老师为你讲解 Python都有什么优点?
- tensorflow tensorboard summary的工作特点
- 方维出现 Fatal error: Class 'Session' not found
- 凸优化第五章对偶 作业题
- 拓端tecdat|R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型
- Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx
- 20HZ信号发生器电路图
- c语言输入若干学生成绩 计算平均,从键盘输入若干名学生的成绩,当输入-1时结束,统计出及格人数...
- XP系统清理优化工具箱
- Android主题色设为透明
- 虚拟机(VM)与JVM
- JS 小写数字格式转大写格式