设计一个算法,判断一个无向图G是不是一颗树,若是返回true,不是返回false
判断一个无向图G是不是一棵树:G必须是无回路的连通图或有n-1条边的连通图
用dfs遍历,若可以遍历所有顶点,并且遍历过的边数是n-1就是一棵树
bool is_tree(mgraph graph, int vis[])
{
int i;
for(i = 0; i < graph.vexnum; i++)
{
vis[i] = false;
}
int Vnum = 0; //记录遍历过的顶点数
int Enum = 0; //遍历过的边数
dfs(graph, Vnum, Enum, vis, 1);
if(Vnum == graph.vexnum && Enum == graph.vexnum-1) return true;
else return false;
}
void dfs(mgraph graph, int& Vnum, int &Enum, int vis[],int k)
{
int i;
vis[k] = true;
Vnum++;
int x = FirstNeighbor(graph, k);
while(x != -1)
{
if(!vis[x])
{
Enum++;
dfs(graph, Vnum, Enum, vis, x)
}
x = NextNeighbor(graph, k, x); //注意这里要写在if外面,意思是有一个“分支”已经走到底了,递归回来再去找那个顶点的下一个neighbor
}
}