题目
设计算法,判断无向图G是否是一棵树。
分析实现
对于一个无向图,判断它是否为一棵树需要满足两点条件:
- 从根结点可达其余所有结点
- 无环
对于第一点,通过BFS/DFS进行遍历并记录每个结点是否访问过就可以得出;
对于第二点,则需要引入parent
数组来记录图中每个结点的“父结点”
具体实现如下(本文的实现为基于邻接矩阵存储方式的图):
// BFS版本判断路径存在
bool hasPathBFS(Graph& G, int start, int stop){
if (start == stop)
return true;
vector<bool> visited(G.vexnum, false);
queue<int> q;
q.push(start);
visited[start] = true;
while(!q.empty()){
int cur = q.front();
q.pop();
for(int i=0; i<G.vexnum; i++){
// 没有边
if(G.edge[cur][i] == 0){
continue;
}
// 找到路径
if(i == stop){
return true;
}
if(!visited[G.edge[cur][i]]){
q.push(i);
visited[i] = true;
}
}
}
return false;
}
总结
以上就是通过BFS和DFS两种方式实现的图的路径的存在性判断。
对于递归函数,刚开始尝试的时候总是会想不到思路。
对此,只需去想递归函数的统一的实现思路——假设函数功能已经实现,先写出递归基,再运用“更小规模”的函数调用来实现递归函数。