目录
题目描述
试设计一个算法,判断一个无向图G是否为一棵树。若是一棵树,则返回1,否则返回0。
来源:王道p211.2
解题思路
一个图,是一棵树的条件有两个:1.连通 2.无回路;第二个条件也可以等价为边数为边数为顶点数-1,因为边数比顶点数少,就不会形成回路。
对于条件1,如何判断图是否连通,对其进行一次遍历(只一次),并记录遍历的顶点个数,如果遍历到的顶点个数少于图的顶点数,则图不连通,否则连通。
对于条件2,在判断条件1时,同时记录图的边个数即可。
图定义
typedef struct ArcNode{ //边结点定义
int adjvex;
struct ArcNode* next;
int info;
}ArcNode;
typedef struct VNode{ //顶点结点定义
int data;
struct ArcNode* first;
}VNode,AdjList[MaxVertexNum];
typedef struct{ //邻接表定义
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
[注] 上述宏定义和结构体定义是答题时要写的答案,并不是代码实现时的定义,代码实现稍有不同,感兴趣可去“help.h”中查看。