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;

}

};

相关推荐
多米Domi01139 分钟前
0x3f 第49天 面向实习的八股背诵第六天 过了一遍JVM的知识点,看了相关视频讲解JVM内存,垃圾清理,买了plus,稍微看了点确定一下方向
jvm·数据结构·python·算法·leetcode
A_nanda10 小时前
c# MOdbus rto读写串口,如何不相互影响
算法·c#·多线程
代码雕刻家11 小时前
2.4.蓝桥杯-分巧克力
算法·蓝桥杯
Ulyanov11 小时前
顶层设计——单脉冲雷达仿真器的灵魂蓝图
python·算法·pyside·仿真系统·单脉冲
智者知已应修善业13 小时前
【查找字符最大下标以*符号分割以**结束】2024-12-24
c语言·c++·经验分享·笔记·算法
91刘仁德13 小时前
c++类和对象(下)
c语言·jvm·c++·经验分享·笔记·算法
diediedei13 小时前
模板编译期类型检查
开发语言·c++·算法
阿杰学AI13 小时前
AI核心知识78——大语言模型之CLM(简洁且通俗易懂版)
人工智能·算法·ai·语言模型·rag·clm·语境化语言模型
mmz120714 小时前
分治算法(c++)
c++·算法
睡一觉就好了。14 小时前
快速排序——霍尔排序,前后指针排序,非递归排序
数据结构·算法·排序算法