dfs|并查集

lcr155

中序遍历二叉搜索树,用++前驱指针串成双向链表++,再把首尾节点相连形成循环链表,返回最小节点

class Solution

{

public:

Node* treeToDoublyList(Node* root)

{

if (!root) return nullptr;

Node* ret = nullptr;

Node* pre = nullptr;

// 记录中序遍历的前一个节点

int mn=INT_MAX;

auto dfs=[&](this auto&& dfs,Node* node)

{

if (!node) return;

dfs(node->left); // 中序遍历先左子树

if(node->val<mn) {

mn=node->val;

ret=node;

}

// 构建双向链表

node->left = pre;

if (pre) pre->right = node;

pre = node;

dfs(node->right);

};

dfs(root);

// 构建循环链表(首尾相连)

pre->right = ret;

ret->left = pre;

return ret;

}

};

lc3108

在n个节点的带权无向图中,对每个查询的起点 s_i 和终点 t_i ,++求两点间旅途的边权按位与的最小值++(无旅途则返回-1,旅途可重复走边/节点)

dfs

DFS遍历图划分连通块,++计算每个连通块内所有边权的按位与值,查询两点是否连通并返回对应结果++(连通返回按位与值,不连通返回-1)

class Solution {

public:

vector<int> minimumCost(int n, vector<vector<int>>& edges, vector<vector<int>>& query) {

vector<vector<pair<int,int>>> g(n);

for(auto& v:edges)

{

g[v[0]].push_back({v[1],v[2]});

g[v[1]].push_back({v[0],v[2]});

}

vector<int> cc_and;

vector<int> ids(n,-1);

auto dfs=[&](auto&& dfs,int x)->int

{

ids[x]=cc_and.size();

int and_=-1;

for(auto& [nex,val]:g[x])

{

and_&=val;

if(ids[nex]==-1)

{

and_&=dfs(dfs,nex);

}

}

return and_;

};

for(int i=0;i<n;i++)

{

if(ids[i]==-1)

cc_and.push_back(dfs(dfs,i));

}

vector<int> ans;

for(auto& q:query)

{

++if(q[0]==q[1]) ans.push_back(0);++

else

{

ans.push_back(ids[q[0]]!=ids[q[1]]?-1:cc_and[ids[q[0]]]);

}

}

return ans;

}

};

++并查集合并图中节点,维护连通块内所有边权的按位与值++

查询两点连通性并返回对应连通块的按位与值(不连通则返回-1)

class Solution {

public:

vector<int> fa;

vector<int> and_;

int find(int x)

{

if(fa[x]!=x)

{

fa[x]=find(fa[x]);

}

return fa[x];

}

vector<int> minimumCost(int n, vector<vector<int>>& edges, vector<vector<int>>& query) {

for(int i=0;i<n;i++)

{

fa.push_back(i);

and_.push_back(-1);

}

for(auto& v:edges)

{

int fx=find(v[0]);

int fy=find(v[1]);

and_[fy]&=v[2];

if(fx!=fy)

{

and_[fy]&=and_[fx];

fa[fx]=fy;

}

}

vector<int> ans;

for(auto& q:query)

{

++if(q[0]==q[1]) ans.push_back(0);++

else

{

ans.push_back(find(q[0])==find(q[1])?and_[find(q[0])]:-1);

}

}

return ans;

}

};

相关推荐
数据大魔方2 小时前
【期货量化进阶】期货Tick数据分析与应用:高频数据入门(TqSdk完整教程)
python·算法·数据挖掘·数据分析·github·程序员创富·期货程序化
小杨同学492 小时前
C 语言实战:堆内存存储字符串 + 多种递归方案计算字符串长度
数据库·后端·算法
君义_noip2 小时前
【模板:字符串哈希】信息学奥赛一本通 1455:【例题1】Oulipo
算法·哈希算法·信息学奥赛·csp-s
fengfuyao9852 小时前
基于Matlab的压缩感知梯度投影重构算法实现方案
算法·matlab·重构
快手技术2 小时前
打破信息茧房!快手搜索多视角正样本增强引擎 CroPS 入选 AAAI 2026 Oral
后端·算法·架构
e***98572 小时前
MATLAB高效算法实战:从基础到进阶优化
开发语言·算法·matlab
CoderCodingNo2 小时前
【GESP】C++五级练习(前缀和练习) luogu-P1387 最大正方形
开发语言·c++·算法
MicroTech20252 小时前
MLGO微算法科技通过 Lindbladians 设计线性微分方程的近似最优量子算法——开放量子系统框架下的量子ODE求解新范式
科技·算法·量子计算