并查集做法:
class Solution {
public:
vector<int> p=vector<int>(200010);
int findd(int x){
return p[x]==x?x:p[x]=findd(p[x]);
}
void unionn(int x,int y){
x=findd(x),y=findd(y);
p[x]=y;
}
bool validPath(int n, vector<vector<int>>& edges, int source, int destination){
iota(p.begin(),p.begin()+n,0);
for(auto t:edges){
unionn(t[0],t[1]);
}
return findd(source)==findd(destination);
}
};
dfs做法:
class Solution {
public:
bool validPath(int n, vector<vector<int>>& edges, int source, int destination){
if(source==destination) return 1;
vector<vector<int>> g(n);
for(auto p:edges){
g[p[0]].push_back(p[1]);
g[p[1]].push_back(p[0]);
}
vector<int> vis(n,0);
bool ok=0;
function<void(int)> dfs=[&](int x){
vis[x]=1;
for(auto y:g[x]){
if(vis[y]) continue;
if(y==destination) ok=1;
dfs(y);
}
};
dfs(source);
return ok;
}
};

本文探讨了两种常用的数据结构和算法:并查集用于高效判断两点间是否有路径连接,通过findd()和unionn()操作简化路径查找;而DFS深度优先搜索则通过递归遍历图结构,寻找从源到目的节点的路径。两种方法在`validPath`函数中对比使用,适用于图论问题解决。
499

被折叠的 条评论
为什么被折叠?



