当前位置: 首页 > news >正文

【模板】最小点权覆盖集 最大点权独立集

【模板】最小点权覆盖集 & 最大点权独立集

大意

求一张二分图的最小点权覆盖集 & 最大点权独立集

思路

首先,我们考虑这样的问题,对于这样的匹配来说的处理方式,为了使得左右匹配,我们一般选择在中间的二分图的边建容量为 \(\infty\) 的边,这样就不会被割掉了,为什么要求最小割呢?

对于一条边:

\[S \xrightarrow{\text{容量 } w_u} u \xrightarrow{\text{容量 } \infty} v \xrightarrow{\text{容量 } w_v} T \]

我们将其左右两边的边割掉一个,那么就是相当于选择了一个点覆盖了中间这个边,最终我们只需要让 \(S\)\(T\) 不连通,就是求最小割。

这样求出的一定是一个最大匹配,那么我们考虑直接建 \(S\)\(I_L\) 连边,容量为 \(val_i\)\(I_R\)\(T\) 连边,容量为 \(val_i\),中间就连容量为 \(\infty\) 的边,如下图:

image

这样跑出的最小割来说,绿色的是割边,那么我们选出的点就是 \(2, 4, 5\),这样我们就求出了我们的最小点权覆盖集。

对于最大点权独立集,与最小点权覆盖集为互补关系。

代码

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAX_N = 1000;
const int MAX_M = 100000;
struct edge {int v, c, next;
} e[MAX_M];
int p[MAX_N], eid;
void init() {memset(p, -1, sizeof(p));eid = 0;
}
void insert(int u, int v, int c) {e[eid].v = v;e[eid].next = p[u];e[eid].c = c;p[u] = eid++;
}
void addedge(int u, int v, int c) {insert(u, v, c);insert(v, u, 0);
}
int S, T;
int d[MAX_N];
bool bfs() {memset(d, -1, sizeof(d));queue<int> q;q.push(S);d[S] = 0;while (!q.empty()) {int u = q.front();q.pop();for (int i = p[u]; i != -1; i = e[i].next) {int v = e[i].v;if (e[i].c > 0 && d[v] == -1) {q.push(v);d[v] = d[u] + 1;}}}return (d[T] != -1);
}
int dfs(int u, int flow) {if (u == T) {return flow;}int res = 0;for (int i = p[u]; i != -1; i = e[i].next) {int v = e[i].v;if (e[i].c > 0 && d[u] + 1 == d[v]) {int tmp = dfs(v, min(flow, e[i].c));flow -= tmp;e[i].c -= tmp;res += tmp;e[i ^ 1].c += tmp;if (flow == 0) {break;}}}if (res == 0) {d[u] = -1;}return res;
}
int Dinic() {int res = 0;while (bfs()) {res += dfs(S, INF);}return res;
}
bool vis[MAX_N];
void DFS(int u) {vis[u] = true;for (int i = p[u]; i != -1; i = e[i].next) {if (!vis[e[i].v] && e[i].c) {DFS(e[i].v);}}
}
int main() {init();int n, m, w, u, v;cin >> n >> m;S = 0;T = 2 * n + 1;for(int i = 1;i <= n;i ++){cin >> w;addedge(S, i, w);}for(int i = n + 1;i <= 2 * n;i ++){cin >> w;addedge(i, T, w);}for(int i = 1;i <= m;i ++){cin >> u >> v;addedge(u, v, INF);}cout << Dinic() << endl;DFS(S);for(int i = 1;i <= 2 * n;i ++){if(i <= n && !vis[i]){cout << i << " ";}else if(i > n && vis[i]){cout << i << " ";}}return 0;
}
http://www.jsqmd.com/news/384251/

相关文章:

  • 强烈安利!专科生必备的降AI率神器 —— 千笔AI
  • JavaScript 零基础入门笔记:核心概念与语法详解
  • 赶deadline必备!千笔·专业学术智能体,专科生论文神器!
  • 赶deadline必备!继续教育论文降重神器 —— 千笔·专业降AI率智能体
  • 情感感知机器人的技术探索与应用
  • 大型污水处理厂自控项目实战:组态王与博图的奇妙碰撞
  • SRE无需多专家协同,一款能自主排查故障的 LLM 智能运维方案
  • 赶deadline必备!自考论文救星 —— 千笔ai写作
  • 这次终于选对!千笔ai写作,冠绝行业的AI论文写作软件
  • 横评后发现!降AIGC软件 千笔·专业降AI率智能体 VS WPS AI,继续教育首选
  • 2026年金华管道疏通推荐:基于长期测试与合规标准评价管道疏通服务 - 十大品牌推荐
  • 在JavaScript / HTML中,cloneNode()办法详细指南
  • AI平台可以投放广告吗?应该联系哪家公司? - 品牌2025
  • 管道疏通服务哪家强?2026年金华管道疏通推荐与排名,解决技术不专业与售后无保障痛点 - 十大品牌推荐
  • JPGC 图片批量修整工具:高效处理图片的“神器”
  • 小X分身APP(手机分身类工具)
  • CSS 布局深究:行框模型、幽灵节点与绝对居中的数学原理
  • FLAC3D 7.0 中修正剑桥模型与固结排水三轴试验模拟
  • 实测对比后AI论文软件 千笔AI VS 文途AI 专科生写论文更省心
  • 学习日记day81
  • 闭眼入! 更贴合本科生的降AIGC平台,千笔·专业降AIGC智能体 VS 灵感风暴AI
  • 学习日记day82
  • 2026年精选代办服务:专业团队让业务办理更便捷,资质代办/公司注册/代办营业执照/注册公司/代办公司,代办公司推荐 - 品牌推荐师
  • 2026年济宁管道疏通推荐:管道健康管理趋势评测,涵盖家庭与工程场景痛点 - 十大品牌推荐
  • 如何选择可靠的管道疏通服务?2026年济南管道疏通全面评测与推荐 - 十大品牌推荐
  • 养娃家庭刚需!2026年无频闪儿童护眼灯推荐,给孩子更安心的学习用光 - 速递信息
  • 【日记】感觉中了 mac 的圈套了(1051 字)
  • BaseAgent源码- init
  • 如何选择杭州管道疏通服务?2026年推荐与评测,解决效率与安全痛点 - 十大品牌推荐
  • 管道疏通服务哪家可靠?2026年济南管道疏通推荐排名,应对复杂堵塞场景 - 十大品牌推荐