98.png

    1. /*
    2. 设计一个算法,判断一个无向图是否是一棵树
    3. 分析:
    4. 我们知道,是树的前提,首先该无向图必须是连通的,且边数不能过多,只能是n-1条边。
    5. 那么我们可以通过深度优先遍历来统计该无向图的边数与顶点数,符合条件则为一棵树
    6. */
    7. #include <stdio.h>
    8. #include <stdlib.h>
    9. #define MAXSIZE 100
    10. #define TYPE int
    11. typedef struct EdgeNode {//边表结点
    12. int index;//该边所指向的顶点的位置
    13. int weight;//权值
    14. EdgeNode *next;//下一个邻接边
    15. }EdgeNode;
    16. typedef struct VertexNode {//顶点表节点
    17. char info;//顶点信息
    18. EdgeNode *firstEdge;//指向第一条依附该顶点的边的指针
    19. }VertexNode, Adjlist[MAXSIZE];
    20. typedef struct {
    21. Adjlist adjlist;//顶点数组
    22. int numE, numV;//边数、顶点数
    23. }ALGraph;
    24. void DFS(ALGraph *G, int *visited, int &numV, int &numE, int index) {
    25. visited[index] = 1;//标记为已访问
    26. numV++;//顶点数加一
    27. for (EdgeNode* p = G->adjlist[index].firstEdge; p; p = p->next) {
    28. if (!visited[p->index]) {
    29. numE++;
    30. DFS(G, visited, numV, numE, p->index);
    31. }
    32. }
    33. }
    34. bool isTree(ALGraph *G) {
    35. int numV = 0, numE = 0;//统计边和顶点
    36. int *visited = (int*)malloc(sizeof(int)*G->numV);
    37. for (int i = 0; i < G->numV; i++) {
    38. *(visited + i) = 0;//标记数组初始化
    39. }
    40. DFS(G, visited, numV, numE, 0);//只进行一次遍历
    41. if (numV == G->numV&&numE == (G->numV - 1)) {
    42. return true;
    43. }
    44. else {
    45. return false;
    46. }
    47. }
    48. int main() {
    49. ALGraph *G = (ALGraph *)malloc(sizeof(ALGraph *));
    50. bool Tree;
    51. void createGraphInFile(ALGraph *);
    52. createGraphInFile(G);//创建图
    53. void dispGraph(ALGraph *G);
    54. dispGraph(G);
    55. Tree = isTree(G);
    56. if (Tree) {
    57. printf("这是一棵树");
    58. }
    59. else {
    60. printf("这不是一棵树");
    61. }
    62. return 0;
    63. }