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

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;

}

};

相关推荐
zx_7414848118 分钟前
YOLOv3 核心原理详解:Darknet-53 架构、多尺度预测与 FPN 特征融合
算法·yolo·目标检测·yolov3
MoRanzhi120318 分钟前
122.四平方和(暴力枚举)
python·数学·算法·蓝桥杯·完全平方数·暴力枚举·四平方和定理
倒头就睡的小比特19 分钟前
贪心算法介绍
算法·贪心算法
万少1 小时前
Qoder sonus模型 20分钟,复刻 马斯克 飞天汽车
前端·后端·算法
七牛云行业应用1 小时前
Muse Spark Open 发布:Meta 称其为美国最强开放权重模型,816B 参数如何落地
算法
esop轻Mes看板亮灯分拣ESD静电安2 小时前
产线“最后一米”的破局密码:ESOP与MES的区别与深度协同
算法
陈天伟教授2 小时前
《数据处理和标注技术》课程能力图谱
人工智能·算法
LMT_Lanmantech2 小时前
HyperWorks许可:almutil显示Unit满了,数据到底准不准?
运维·服务器·算法
禁默2 小时前
论文解读与思考:基于场所地图的标识感知机器人探索方法及工程参考的价值
人工智能·深度学习·算法·机器人
维克兜率天2 小时前
【维克】统计套利建模:从因子到信号的完整流程
android·开发语言·python·算法·kotlin