并查集做法:
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;
}
};