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

U103816 【模板】最大权闭合子图

U103816 【模板】最大权闭合子图

大意

求最大权闭合子图。

思路

首先,对于这个题目来说,我们首先要明确一个问题,对于一个点 \(i\),其所有出边所指向的点所构成的集合为 \(I_{out}\),那么说,我们只要选择了 \(i\) 点,就必须选择 \(I_{out}\) 中的所有点。

这个题的值在点上,我们想要选择是尽可能多的正权值的点,尽可能少的负权值的点,这个事情我们可以交给最小割来处理。我们做这样的建模,建立 \(S\) 源点,表示你不选择正权点 \(a\) 所构成的集合,建立 \(T\) 汇点,表示你选择负权点 \(b\) 所构成的集合。由 \(S\) 向每一个正权的点连容量为 \(val\) 的边,由每个负权点向 \(T\) 连容量为 \(-val\) 的边。

这时候就有人要问了:主播主播,那你如何保证子图是闭合的?

好问题,我们只需要保证如果选了 \(i\) 点,那么 \(I_{out}\) 不会被割到另一边,这种约束我们直接连一条容量为 \(\infty\) 的边,这样就永远不会被最小割割掉。

这个时候我们求出的最小割代表的含义就是:选择某些负点付出的代价 + 不选某些正点付出的代价

显然我们最后的答案是 \(\sum val_i(val_i > 0) - \text{mincut}\)

代码

#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, sum = 0;cin >> n >> m;S = 0;T = n + 1;for(int i = 1;i <= n;i ++){cin >> w;if(w > 0){addedge(S, i, w);sum += w;}else if(w < 0){addedge(i, T, -w);}}for(int i = 1;i <= m;i ++){cin >> u >> v;addedge(u, v, INF);}cout << sum - Dinic() << endl;// DFS(S);// for(int i = 1;i <= n;i ++){//     if(vis[i]){//         cout << i << " ";//     }// }// cout << endl;return 0;
}
http://www.jsqmd.com/news/384212/

相关文章:

  • 乙醇市场新动态:这些厂家表现如何?,酒精/工业酒精/回收异丙醇/回收废酒精/回收酒精/回收乙醇,乙醇品牌排行榜单 - 品牌推荐师
  • 腾讯云迁移上云功能
  • 2026年哈尔滨管道疏通推荐:市政服务趋势评测,涵盖家庭与工程场景疏通维护痛点 - 十大品牌推荐
  • 管道疏通服务哪家强?2026年淮安管道疏通推荐与排名,解决技术落后与售后无保障痛点 - 十大品牌推荐
  • 跨生态系统 (Apple HomeKit, Google Home) 的 Web API 信任链测试
  • NMN哪个牌子好靠谱?2026年十大NMN揭榜,W+端粒塔领跑抗衰市场 - 速递信息
  • 釜底抽薪:自主AI代理在移动与IoT设备上的权限滥用攻击与行为审计实战
  • 2026年淮安管道疏通推荐:基于长期可靠性评测,涵盖家庭与工业场景疏通痛点 - 十大品牌推荐
  • 海口管道疏通哪家靠谱?2026年服务商推荐与排名,解决堵塞与清淤核心痛点 - 十大品牌推荐
  • 零基础学习大语言模型之十五:Transformer模型 - 详解
  • 2026年化州管道疏通推荐:基于多场景实测评价,解决堵塞与异味核心痛点 - 十大品牌推荐
  • NMN哪个牌子值得选?2026权威评测榜,盼生派NNN领衔,附科学评测指南 - 速递信息
  • 2026年化州管道疏通推荐:基于多场景实测评价,解决堵塞与溢流核心痛点 - 十大品牌推荐
  • 广州管道疏通哪家靠谱?2026年服务商推荐与排名,解决技术不专业痛点 - 十大品牌推荐
  • 2026年海口管道疏通推荐:市政与家庭场景服务能力全面评测与推荐 - 十大品牌推荐
  • 如何为不同堵塞场景选服务?2026年广州管道疏通全面评测与推荐 - 十大品牌推荐
  • 山东一卡通回收平台推荐:高效、安全的线上回收方式 - 团团收购物卡回收
  • 2026年贵阳管道疏通推荐:基于行业标准与服务质量评测的权威推荐 - 十大品牌推荐
  • 快速查询上海智推时代联系方式:高效对接优质资源 - 速递信息
  • 2026年贵阳管道疏通推荐:市政与家庭场景综合服务能力评测与推荐 - 十大品牌推荐
  • 管道疏通服务哪家强?2026年哈尔滨管道疏通推荐与排名,直击响应慢与效果差痛点 - 十大品牌推荐
  • 一键直达上海智推时代:官方联系方式全汇总 - 速递信息
  • 管道疏通服务哪家强?2026年阜阳管道疏通推荐排名,解决效率与安全痛点 - 十大品牌推荐
  • 100.寻找重复数
  • 如何为不同场景选疏通服务?2026年阜阳管道疏通全面评测与推荐,直击响应慢与效果差痛点 - 十大品牌推荐
  • 2026年阜新管道疏通推荐:基于多场景实测评价,解决堵塞与清淤核心痛点 - 十大品牌推荐
  • 阜新管道疏通哪家靠谱?2026年服务商推荐与评价,直击响应与质量痛点 - 十大品牌推荐
  • 智慧校园顶层设计如何助力学校数字化转型战略落地
  • 学长亲荐 8个降AIGC平台:专科生降AI率全测评与推荐
  • 干货合集:9个AI论文软件深度测评,MBA毕业论文与科研写作必备!