算法思想:一个无向图 G是一棵树的条件是, G必须是无回路的连通图或有 n-1条边的连通图。这里采用后者作为判断条件。对连通的判定,可用能否遍历全部顶点来实现。可以采用深度优先搜索算法在遍历图的过程中统计可能访问到的顶点个数和边的条数,若一次遍历就能访问到n个顶点和n-1条边,则可断定此图是一棵树。
算法实现如下:
bool isTree(Graph& G){
for(i=1;i<G.vexnum;i++)
visited[i] = false; //访问标记visit[]初始化
int Vnum = 0, Enum = 0; //记录顶点数和边数
DFS(G, 1 , Vnum, Enum, visited);
if(Vnum == G.vexnum&&Enum == 2(G.vexnum-1)) //2倍是采用邻接矩阵存储
return true;//符合一棵树的条件
else
return false;//不符合
}
void DFS(Graph& G, int v, int& Vnum, int& Enum, int visited[]){
visited[v] = true; //做访问标记
Vnum++; //访问到增加1
int w = FirstNeighbor(G,v); //取v的第一个邻接顶点
while(w!=-1)
{ //邻接顶点存在
Enum++; //边存在,计边
if(!visited[w])//未被访问
DFS(G, w, Vnum, Enum, visited); //进入递归
w= NextNeighbor(G, v, w);
}
}