DFS生成森林
生成【非连通图】的【深度优先生成森林】
【存储方式】孩子兄弟链表
typedef struct CSNode{
TElemType data;
struct CSNode *firstchild, *nextsibling;
}CSNode, *CSTree;
// 建立无向图G的深度优先生成森林的 (最左)孩子(右)兄弟链表T
void 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
}
}
}