【模板】拟阵交

【模板】拟阵交

给定边集 \(E\),每条边都有一个颜色。给定数组 \(\{C_i\}\)。选出最大的子集使得:子集中找不到一个简单环;子集中颜色 \(c\) 的边的出现次数不超过 \(C[c]\)

本题即为拟阵交的模板题,需要求解图拟阵和划分拟阵的交中最大的独立集。可以证明,它们的交还是拟阵,故使用拟阵交算法解决该问题。

请参考:从拟阵基础到 Shannon 开关游戏 - 洛谷专栏

步骤:

  1. 拟阵 A(图拟阵):没有简单环的集合是独立集。
  2. 拟阵 B(划分拟阵):颜色 \(c\) 的边的出现次数都不超过 \(C[c]\) 的集合是独立集。
  3. 据此写出两个拟阵的代码,支持设定一个 \(I\)build),和给定 \(x\) 返回 \(I\cup\{x\}\) 是否在拟阵中(oracle)。
  4. \(I=\varnothing\) 开始,重复以下步骤:
    1. 建一张空的有向二分图,\(I\) 是左部点,\(E\setminus I\) 是右部点。
    2. 枚举 \(i\in I\),将两个拟阵的 \(I'\) 设置为当前的 \(I\setminus\{i\}\)。枚举 \(j\not\in I\),若拟阵 A oracle(j) 则连边 \(i\to j\);若拟阵 B oracle(j) 则连边 \(j\to i\)
    3. 准备进行 BFS 找增广路。设置拟阵 A 的 \(I'=I\),将所有 \(i\not\in I\) 且能 oracle\(i\) 入队。
    4. 进行 BFS,注意要维护最短的增广路,最短就是点数最少的意思;还要维护路径的前驱。
    5. 设置拟阵 B 的 \(I'=I\),枚举所有 \(i\not\in I\) 且能 oracle\(i\),找出最短路最短的那个 \(i\)
    6. 从那个最短的点往回跳,将增广路上所有点在 \(I\) 的状态取反。
  5. 算法无法找出增广路时,算法结束,\(I\) 就是答案。
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr, ##__VA_ARGS__)
#else
#define debug(...) void(0)
#define endl "\n"
#endif
using LL = long long;
template <int N>
struct unionset {int fa[N], siz[N];unionset() { iota(fa, fa + N, 0), fill_n(siz, N, 1); }int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }bool merge(int x, int y) {x = find(x), y = find(y);if (x == y) return false;if (siz[x] < siz[y]) swap(x, y);fa[y] = x, siz[x] += siz[y];return true;}
};
constexpr int N = 510;
struct edge {int u, v, w;
};
int n, m, c[N], K;
bool vis[N];
edge e[N];
struct matroid_graph {unionset<N> dsu;void build(int ban) {dsu = unionset<N>();for (int i = 1; i <= m; i++) if (vis[i] && i != ban) {dsu.merge(e[i].u, e[i].v);}}bool oracle(int x) {return dsu.find(e[x].u) != dsu.find(e[x].v);}
};
struct matroid_color {int cnt[N];void build(int ban) {memset(cnt, 0, sizeof cnt);for (int i = 1; i <= m; i++) if (vis[i] && i != ban) {cnt[e[i].w] += 1;}}bool oracle(int x) {return cnt[e[x].w] < c[e[x].w];}
};
int main() {
#ifndef LOCALcin.tie(nullptr)->sync_with_stdio(false);
#ifndef NF
#endif
#endifcin >> n >> m >> K;for (int i = 1; i <= K; i++) cin >> c[i];for (int i = 1, u, v, w; i <= m; i++) {cin >> u >> v >> w;e[i] = {u, v, w};}matroid_graph m1;matroid_color m2;memset(vis, false, sizeof vis);static bool g[N][N];while (true) {memset(g, false, sizeof g);for (int i = 1; i <= m; i++) if (vis[i]) {m1.build(i), m2.build(i);for (int j = 1; j <= m; j++) if (!vis[j]) {if (m1.oracle(j)) g[i][j] = true;if (m2.oracle(j)) g[j][i] = true;}}static int pre[N], dis[N];memset(dis, 0x3f, sizeof dis);queue<int> q;m1.build(0);for (int i = 1; i <= m; i++) if (!vis[i] && m1.oracle(i)) q.push(i), pre[i] = 0, dis[i] = 0;while (!q.empty()) {int u = q.front(); q.pop();for (int v = 1; v <= m; v++) if (g[u][v] && dis[v] > dis[u] + 1) dis[v] = dis[u] + 1, pre[v] = u, q.push(v);}m2.build(0);int rp = -1;for (int i = 1; i <= m; i++) if (!vis[i] && m2.oracle(i) && (rp == -1 || dis[rp] > dis[i])) rp = i;if (rp == -1 || dis[rp] > 1e9) break;while (rp) vis[rp] ^= 1, rp = pre[rp];}int cnt = 0;for (int i = 1; i <= m; i++) cnt += !vis[i];cout << cnt << endl;for (int i = 1; i <= m; i++) if (!vis[i]) cout << i << " ";cout << endl;return 0;
}

所以谁能告诉我,为什么拟阵会有一个甲骨文(oracle)操作呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1196414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[豪の算法奇妙冒险] 代码随想录算法训练营第三十五天 | 01背包问题-二维dp解法、01背包问题-一维dp解法、416-分割等和子集

01背包问题-二维dp解法、01背包问题-一维dp解法、LeetCode416 分割等和子集代码随想录算法训练营第三十五天 | 01背包问题-二维dp解法、01背包问题-一维dp解法、416-分割等和子集01背包问题-二维dp解法文章讲解:https…

expo-video实现横屏播放

我在使用expo-video的过程中,发现它的全屏功能很是差强人意,所以想自己二次封装一下 如果看过我之前的expo文章,应该可以轻松的读懂下面的代码 一、安装相关依赖 npx expo install expo-video expo-router expo-scr…

2026百度AI优化GEO服务商 TOP5:综合实力强的文心一言GEO服务商领跑AI搜索破局赛道

综合实力强的 GEO服务商 赋能品牌实现 百度AI 精准曝光与流量转化 随着生成式人工智能的迅速发展,AI搜索平台正在重构传统信息分发与获取的模式。特别是以百度“文心一言”为代表的AI原生平台,逐步替代了传统的搜索入…

【珍藏干货】从零开始实战:企业级AI售前机器人开发全流程(含三大核心系统详解)

“从0到1完成一个企业级AI售前机器人的实战指南。” AI应用中除了我们常见的工作流、各类功能节点之外&#xff0c;通常还会附带有三个辅助系统&#xff1a; 用来AI记住用户的历史交互信息&#xff0c;从而提供更连贯、个性化和高效的响应的记忆系统用来验证AI在实际应用中的…

盘点7款热门AI论文写作助手:提升学术效率并有效减少重复内容

AI写论文工具排名&#xff1a;7大模型查重率低技巧推荐 7大AI论文工具核心对比 工具名称 核心功能 查重优化 适用场景 效率评分 AiBiye 论文全流程辅助 智能降重 从选题到定稿 ★★★★★ AiCheck 查重与降重 深度降重算法 论文修改阶段 ★★★★☆ AskPaper …

想让win11暂停系统自动更新要怎么办?如何彻底禁止win11系统自动更新

Windows 11的自动更新功能&#xff0c;初衷是为了提升系统安全与性能。但在实际使用中&#xff0c;频繁的后台下载和强制重启往往让人困扰&#xff0c;尤其是对正在工作、游戏或需要稳定环境的用户来说&#xff0c;更是不可忽视的问题。因此&#xff0c;学会灵活地关闭或延迟自…

AI论文助手Top8:全方位对比主流平台写作水准与降重能力,高效解决用户需求

AI论文生成工具排行榜&#xff1a;8个网站对比&#xff0c;论文降重写作功能全 工具对比总结 以下是8个AI论文工具的简要排名&#xff0c;基于核心功能、处理速度和适用性对比。排名侧重实用性与用户反馈&#xff0c;数据源于引用内容案例&#xff1a; 工具名称 主要功能 优…

Leetcode 238. Product of Array Except Self

问题理解 给定一个整数数组 nums,要求返回一个新数组 answer,其中 answer[i] 是除 nums[i] 以外所有元素的乘积。注意,有0存在。思路 第一个想法是类似sliding window法,先算第 1~(n-1) 个元素的乘积,作为ans[0],…

电脑win11系统怎么关闭自动更新,win11暂停和关闭系统自动更新6大招轻松搞定

Windows 11的自动更新功能&#xff0c;初衷是为了提升系统安全与性能。但在实际使用中&#xff0c;频繁的后台下载和强制重启往往让人困扰&#xff0c;尤其是对正在工作、游戏或需要稳定环境的用户来说&#xff0c;更是不可忽视的问题。因此&#xff0c;学会灵活地关闭或延迟自…

Oracle数据库迁移至KingbaseES:完整实战指南

Oracle数据库迁移至KingbaseES&#xff1a;完整实战指南 KingbaseES内部提供了大量的Oracle兼容特性&#xff0c;因此&#xff0c;在实际的迁移过程中&#xff0c;一般只需对导出脚本做很少的修改&#xff0c;甚至在迁移对象功能全兼容的情况下可以不做任何修改。不仅如此&…

【异常】FreeMarker 模板文件找不到问题解决方案 Template not found for name “mail/captcha.ftl“.

一、报错内容 cn.hutool.core.io.IORuntimeException: TemplateNotFoundException: Template not found for name "mail/captcha.ftl". The name was interpreted by this TemplateLoader: ClassTemplateLoader(classLoader="jdk.internal.loader.ClassLoaders…

保姆级教程:Ubuntu搭建本地AI助手,从Docker到DeepSeek-R1一站式指南,建议收藏!

本文主要介绍如何在Ubuntu操作系统环境下&#xff0c;零基础快速安装Docker环境、安装Ollama、安装本地大模型DeepSeek-R1和大模型可视化工具Open WebUI&#xff0c;快速在本地搭建一款专属AI智能小助手。 1.检查Docker环境 检查是否已安装docker运行环境&#xff0c;在控制台…

NAS —— Centos8挂载Nas到本地目录使用(多图完整教程)

需求与结果 需求:有一台Centos8台式机、一台Synology Nas(DS821),需要将Nas挂载到Centos8上目录上进行使用。 最终结果: 步骤 1、首先保证Centos8可以ping通NAS设备、同时可在Centos8上访问NAS网页端。        2、进入NAS网页操作 (1) 进入DSM控制面板 → 共享文件…

由特殊到一般

lc3301 从最大元素开始贪心 对数组降序排序后&#xff0c;让每个元素不超过前一个元素减1 若出现非正数则返回-1&#xff0c;否则计算数组元素总和 class Solution { public: long long maximumTotalSum(vector<int>& maximumHeight) { ranges::sort(max…

【AI+教育】实践:从策略优化到群体应用的探索

例如&#xff0c;有研究聚焦智能苏格拉底绘画机器人的开发。该机器人内置苏格拉底对话模式&#xff0c;这是一种古老的对话模式。苏格拉底的对话模式&#xff0c;主张通过不断追问&#xff0c;引导人们对自身所做之事进行更深层次的反思与思考。研究通过苏格拉底追问式构建多智…

深入解析:基于势场法的多智能体机器人编队控制

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

吐血推荐8个AI论文软件,助你轻松搞定本科生毕业论文!

吐血推荐8个AI论文软件&#xff0c;助你轻松搞定本科生毕业论文&#xff01; AI工具让论文写作不再难 对于许多本科生来说&#xff0c;撰写毕业论文是一项既复杂又充满挑战的任务。从选题到资料收集&#xff0c;从大纲搭建到初稿完成&#xff0c;每一个环节都可能让人感到手足无…

揭秘提示工程架构师在电子商务应用的领先策略

揭秘提示工程架构师在电子商务应用的领先策略&#xff1a;开启电商智能新时代 关键词&#xff1a;提示工程架构师、电子商务、语言模型、用户体验、个性化推荐、智能客服 摘要&#xff1a;本文深入探讨提示工程架构师在电子商务领域的关键作用及其领先策略。通过生动的比喻和…

SDL2库基础使用

1.初始化 SDL2 子系统(视频相关),失败则打印错误并返回 -1 if (SDL_Init(SDL_INIT_VIDEO)) {fprintf(stderr, "SDL_Init: %s\n", SDL_GetError()); // 输出初始化失败原因return -1; // 返回错误码 }2.…

android 系统中间件和 平台中间件 的区别,Framework等

这是一个非常专业的问题&#xff0c;涉及到Android系统架构的核心层次。简单来说&#xff0c;平台中间件是通用、标准化的“官方层”&#xff0c;而系统中间件是厂商深度定制、差异化的“优化层”。 下面我通过一个表格来清晰地概括两者的主要区别&#xff0c;然后再详细解释&a…