DFS生成森林

生成【非连通图】的【深度优先生成森林】

【存储方式】孩子兄弟链表

  1. typedef struct CSNode{
  2. TElemType data;
  3. struct CSNode *firstchild, *nextsibling;
  4. }CSNode, *CSTree;
  5. // 建立无向图G的深度优先生成森林的 (最左)孩子(右)兄弟链表T
  6. void DFSForest(Graph G, CSTree &T) {
  7. T = NULL;
  8. for (v=0; v<G.vexnum; ++v) {
  9. visited[v] = FALSE;
  10. }
  11. for (v=0; v<G.vexnum; ++v) {
  12. if (!visited[v]) { //第v顶点为新的生成树的根结点
  13. p = (CSTree)malloc(sizeof(CSNode) ); //分配根结点
  14. *p = {GetVex(G,v), NULL, NULL}; //给该结点赋值
  15. if (!T) T=p; //是第一棵生成树的根(T的根)
  16. else q->nextsibling = p; //是其他生成树的根(前一棵的根的"兄弟")
  17. q = p; //q指示当前生成树的根
  18. DFSTree(G, v, p); //建立以P为根的生成树
  19. }
  20. }
  21. }
  22. // 从第v个顶点出发深度优先遍历图G,建立以T为根的生成树
  23. void DFSTree(Graph G, int v, CSTree &T) {
  24. visited[v] = True;
  25. first = True;
  26. for (w=FirstAdjvex(G, v); w>=0; w=NextAdjvex(G, v, w)) {
  27. if (!visited[w]) {
  28. p = (CSTree)malloc(sizeof(CSNode)); //分配孩子结点
  29. *p = {GetVex(G, w), NULL, NULL};
  30. if (first) { //w是v的第一个未访问的邻接顶点
  31. T->lchild = p; //是根的左孩子结点
  32. first = False;
  33. } else { //w是v的其他未被访问的邻接顶点
  34. q->nextsibling = p; //是上一邻接顶点的右兄弟结点
  35. }
  36. q = p;
  37. DFSTree(G, w, q); //从第w个顶点出发深度优先遍历图G,建立子生成树q
  38. }
  39. }
  40. }