• 2015软专算法题T1(无向图树)


    请设计一个算法判断无向图G是否为一棵树,若是树,则返回1;否则,返回0。

    解题思路:jt要注意无向图和有向图建图时的区别;用深搜遍历图,记录边数和顶点数,若边数=2*(顶点数-1),则是无向图树。因为在无向图里,每条边存了两次。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int MAXN=100;
    6. typedef struct ArcNode//边表结点
    7. {
    8. int adjvex;
    9. ArcNode *nextvex;
    10. };
    11. typedef struct Vnode//顶点表结点
    12. {
    13. int data;
    14. ArcNode *firstvex;
    15. };
    16. typedef struct Graph//图
    17. {
    18. Vnode adjlist[MAXN];
    19. int n;
    20. int e;
    21. }*graph;
    22. graph g=(graph)malloc(sizeof(Graph));
    23. void build(graph g)//用邻接表存储图
    24. {
    25. printf("n,e==");
    26. scanf("%d%d",&g->n,&g->e);
    27. for(int k=1;k<=g->n;k++)
    28. {
    29. g->adjlist[k].data=k;
    30. g->adjlist[k].firstvex=NULL;
    31. }
    32. printf("输入边边的from和to:\n");
    33. int i,j;
    34. for(int k=1;k<=g->e;k++)
    35. {
    36. scanf("%d%d",&i,&j);
    37. ArcNode *p=(ArcNode*)malloc(sizeof(ArcNode));
    38. p->adjvex=j;
    39. p->nextvex=g->adjlist[i].firstvex;
    40. g->adjlist[i].firstvex=p;
    41. //如果是有向图,则没有下面的代码
    42. ArcNode *q=(ArcNode*)malloc(sizeof(ArcNode));
    43. q->adjvex=i;
    44. q->nextvex=g->adjlist[j].firstvex;
    45. g->adjlist[j].firstvex=q;
    46. }
    47. }
    48. void print(graph g)//输出邻接表存储的图
    49. {
    50. for(int k=1;k<=g->n;k++)
    51. {
    52. printf("%d ",g->adjlist[k].data);
    53. ArcNode *p=g->adjlist[k].firstvex;
    54. while(p!=NULL)
    55. {
    56. printf("%d ",p->adjvex);
    57. p=p->nextvex;
    58. }
    59. printf("\n");
    60. }
    61. }
    62. int visit[100];//标记数组
    63. int nnum=0;//记录顶点数
    64. int ednum=0;//记录边条数
    65. void dfs(graph g,int v,int &nnum,int &ednum)//深搜
    66. {
    67. visit[v]=1;
    68. nnum++;
    69. ArcNode *p=g->adjlist[v].firstvex;
    70. while(p!=NULL)
    71. {
    72. ednum++;//p不为空说明存在一条边
    73. if(visit[p->adjvex]==0)
    74. {
    75. dfs(g,p->adjvex,nnum,ednum);
    76. }
    77. p=p->nextvex;
    78. }
    79. }
    80. bool isTree(graph g)
    81. {
    82. memset(visit,0,sizeof(visit));
    83. dfs(g,1,nnum,ednum);
    84. if(nnum==g->n&&ednum==2*(g->n -1)) return true;//无向图树的特点
    85. }
    86. int main()
    87. {
    88. build(g);
    89. print(g);
    90. if(isTree(g))
    91. {
    92. printf("是\n");
    93. }
    94. else printf("否\n");
    95. return 0;
    96. }
    97. /*非树测试数据
    98. 5 5
    99. 1 2
    100. 1 3
    101. 2 4
    102. 3 4
    103. 4 5
    104. */
    105. /*树测试数据
    106. 5 4
    107. 1 2
    108. 1 3
    109. 2 4
    110. 3 5
    111. */

  • 相关阅读:
    软设上午题错题知识点8
    Vue2 & Element | 一文带你快速搭建网页界面UI
    《数字图像处理-OpenCV/Python》连载(22)绘制直线与线段
    LeetCode-133. 克隆图-Java-medium
    组件化架构搭建——铺路Android架构师
    神经元在人体内如何分布,人体神经元怎么分布的
    Android11.0 修改设备名、型号、厂商
    力扣(LeetCode)13. 罗马数字转整数(C++)
    SQL 常见问题汇总,持续更新
    银河麒麟桌面操作系统 V10 SP1下Qt应用程序开发环境配置
  • 原文地址:https://blog.csdn.net/UncleJokerly/article/details/127940683