DFS生成森林
生成【非连通图】的【深度优先生成森林】
【存储方式】孩子兄弟链表
typedef struct CSNode{TElemType data;struct CSNode *firstchild, *nextsibling;}CSNode, *CSTree;// 建立无向图G的深度优先生成森林的 (最左)孩子(右)兄弟链表Tvoid DFSForest(Graph G, CSTree &T) {T = NULL;for (v=0; v<G.vexnum; ++v) {visited[v] = FALSE;}for (v=0; v<G.vexnum; ++v) {if (!visited[v]) { //第v顶点为新的生成树的根结点p = (CSTree)malloc(sizeof(CSNode) ); //分配根结点*p = {GetVex(G,v), NULL, NULL}; //给该结点赋值if (!T) T=p; //是第一棵生成树的根(T的根)else q->nextsibling = p; //是其他生成树的根(前一棵的根的"兄弟")q = p; //q指示当前生成树的根DFSTree(G, v, p); //建立以P为根的生成树}}}// 从第v个顶点出发深度优先遍历图G,建立以T为根的生成树void DFSTree(Graph G, int v, CSTree &T) {visited[v] = True;first = True;for (w=FirstAdjvex(G, v); w>=0; w=NextAdjvex(G, v, w)) {if (!visited[w]) {p = (CSTree)malloc(sizeof(CSNode)); //分配孩子结点*p = {GetVex(G, w), NULL, NULL};if (first) { //w是v的第一个未访问的邻接顶点T->lchild = p; //是根的左孩子结点first = False;} else { //w是v的其他未被访问的邻接顶点q->nextsibling = p; //是上一邻接顶点的右兄弟结点}q = p;DFSTree(G, w, q); //从第w个顶点出发深度优先遍历图G,建立子生成树q}}}
