树:连通无回路的图
判断一个图是否为树结构就是判断这个图是否有环,如果无环且连同分量为1,则是树结构
1.BFS
class Solution {
public:
bool validTree(int n, vector<vector<int>>& edges) {
vector<vector<int>> graph(n,vector<int>(n));
for(int i=0;i<edges.size();i++){
graph[edges[i][0]][edges[i][1]]=1;
graph[edges[i][1]][edges[i][0]]=1;
}
queue<int>q;
q.push(0);
bool visited[n];
memset(visited,false,sizeof(visited));
while(!q.empty()){
int cur = q.front();
q.pop();
visited[cur]=true;
for(int i=0;i<n;i++){
if (graph[cur][i] == 1){
if(visited[i]) return false;
visited[i]=true;
graph[cur][i] = 0;
graph[i][cur] = 0;
q.push(i);
}
}
}
for(int i=0;i<n;i++){
if(!visited[i]) return false;
}
return true;
}
};
2.并查集
class Solution {
public:
bool validTree(int n, vector<vector<int>>& edges) {
//vector<int>parent(n,-1);
int parent[n];
memset(parent,-1,sizeof(parent));
for(int i=0;i<edges.size();i++){
int x=edges[i][0];
int y=edges[i][1];
if(!unionSet(x,y,parent)) return false;
}
int count=0;
for(int i=0;i<n;i++){
if(parent[i]==-1) count++;
}
if(count!=1) return false;
return true;
}
int findRoot(int x,int par[]){
return par[x]==-1?x:par[x]=findRoot(par[x],par);
}
bool unionSet(int x,int y,int par[]){
int x_root = findRoot(x,par);
int y_root = findRoot(y,par);
if(x_root==y_root) return false;
par[x_root] = y_root;
return true;
}
};
323 无向图中连通分量的数目
class Solution {
public:
int countComponents(int n, vector<vector<int>>& edges) {
if(n==0) return 0;
int parent[n];
memset(parent,-1,sizeof(parent));
for(int i=0;i<edges.size();i++){
int x=edges[i][0];
int y=edges[i][1];
unionSet(x,y,parent) ;
}
int count=0;
for(int i=0;i<n;i++){
if(parent[i]==-1) count++;
}
return count;
}
int findRoot(int x,int par[]){
return par[x]==-1?x:par[x]=findRoot(par[x],par);
}
void unionSet(int x,int y,int par[]){
int x_root = findRoot(x,par);
int y_root = findRoot(y,par);
if(x_root==y_root) return ;
par[x_root] = y_root;
return ;
}
};