标签:
问题: 给定无向简单图的相邻矩阵,确定这个图是不是树
定理1 一个无向图是树当且仅当在它的每对定点之间存在唯一简单通路。
可以给出一个算法:使用广度优先搜索,能够遍历所有节点并且在访问一个节点之后。
后面遍历的到的节点中不再包含这个节点。
算法如下:
数据结构: Mark数组存储节点是否被遍历过的,-1代表没被遍历,1代表已经被遍历
relationString数组存储 图中包含元素
第一步:
找到一个节点做为树根,将它的所有孩子标记为1,
第二步:
以上一步产生的所有孩子为根节点,广度优先搜索这些孩子的节点。如果新访问到的节点已经被访问,则判断此图不是树,
反之标记这些孩子为1。并且重复此过程,直到遍历所有根节点的子孙。
第三步:判断mark数组中是否含有标记为-1的位置,如果有则判断图不是树。
代码如下。
private boolean Judge(String[] relationString, int[][] matrix, int[] mark,int bef, int aft) {
// 找到第一个元素的所有配对 如 <a,b>
for (int i = 0; i < mark.length; i++) {
if (matrix[aft][i] == 1) {// 检索到新元素
if (i == bef) {
}// 判断是否是已经被检索的边,判断为是就直接跳过就行了
else if (bef != i) {// 是检索到的新的边
if (mark[i] == 1) {// 有重边
return false;
}
mark[i] = 1;
if (!Judge(relationString, matrix, mark, aft, i)) {
return false;
}
}
}
}
return true;
}
标签:
原文地址:http://www.cnblogs.com/GUET-edu-cn/p/5137031.html