题目
设计算法,判断无向图G是否是一棵树。
分析实现
对于一个无向图,判断它是否为一棵树需要满足两点条件:
- 从根结点可达其余所有结点
- 无环
对于第一点,通过BFS/DFS进行遍历并记录结点的访问情况就可以得出;
对于第二点,则需要在遍历的同时检查该结点的“子结点”(非“父结点”的邻居)是否都只会访问到一次。为实现这一点,还需要引入parents
数组来记录图中每个结点的“父结点”。
具体实现如下(本文的实现为基于邻接矩阵存储方式的图):
// 判断图G是否是树
bool isTree(Graph& G, int v){
vector<bool> visited(G.vexnum, false);
visited[v] = true;
queue<int> q;
q.push(v);
vector<int> parents(G.vexnum, -1);
while(!q.empty()){
int cur = q.front();
q.pop();
for(int i=0; i<G.vexnum; i++){
if(G.edge[cur][i] == 0)
continue;
// 结点i是cur的邻居/“子结点”
if(!visited[i]){
// 结点i是第一次被访问
visited[i] = true;
parents[i] = cur;
q.push(i);
}else if(i != parents[cur]){
// i已经被访问过,且i不是cur的父结点
return false;
}
}
}
for(int i=0; i<G.vexnum; i++){
if(!visited[i])
return false;
}
return true;
}
总结
以上就是通过BFS实现的无向图是否满足树性质的判断。
此处通过数组visited
数组来记录结点的访问情况;使用parents
数组记录了每个结点的“父结点”。