贪心构造+枚举子集+有向图判环

lc3445

无向图当中用一个数组标记每个节点是否访问过,记录这个节点它的父节点,如果一个节点不是fa &&被访问过,就说明环

可以bfs/dfs/union判环

推到有向图 两种状态表示已经无法判定,我们可以用到三色染色法

class Solution {

public:

vector<vector<int>> supersequences(vector<string>& words) {

// 收集有哪些字母,同时建图

int all = 0, mask2 = 0;

vector<int> g26{};

for (auto& s : words) {

int x = s0 - 'a', y = s1 - 'a';

all |= 1 << x | 1 << y;

if (x == y) {

mask2 |= 1 << x;

}

gx.push_back(y);

}

// 判断是否有环

auto has_cycle = \&(int sub) -> bool {

int color26{};

auto dfs = \&(this auto&& dfs, int x) -> bool {

colorx = 1;

for (int y : gx) {

// 只遍历在 sub 中的字母

if ((sub >> y & 1) == 0) {

continue;

}

if (colory == 1 || colory == 0 && dfs(y)) {

return true;

}

}

colorx = 2;

return false;

};

for (int i = 0; i < 26; i++) {

// 只遍历在 sub 中的字母

if (colori == 0 && sub >> i & 1 && dfs(i)) {

return true;

}

}

return false;

};

unordered_set<int> st;

int max_size = 0;

// 枚举 mask1 的所有子集 sub

int mask1 = all ^ mask2;

int sub = mask1;

do {

int size = popcount((unsigned) sub);

// 剪枝:如果 size < min_size 就不需要判断了

if (size >= max_size && !has_cycle(sub)) {

if (size > max_size) {

max_size = size;

st.clear();

}

st.insert(sub);

}

sub = (sub - 1) & mask1;

} while (sub != mask1);

vector<vector<int>> ans;

for (int sub : st) {

vector<int> cnt(26);

for (int i = 0; i < 26; i++) {

cnti = (all >> i & 1) + ((all ^ sub) >> i & 1);

}

ans.push_back(cnt);

}

return ans;

}

};

相关推荐
布莱克60514 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
D e re k ZH17 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
石小石Orz18 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
民乐团扒谱机20 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
青少儿编程课堂20 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
武子康1 天前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习
zh_xuan1 天前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长1 天前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
早起CaiCai1 天前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法