无向图的生成树和生成森林算法
2011-12-14 13:26
1511 查看
对图的深度优先搜索遍历DFS(或BFS)算法稍作修改,就可得到构造图的DFS生成树算法。
在算法中,树的存储结构采用孩子—兄弟表示法。首先建立从某个顶点V出发,建立一个树结点,然后再分别以V的邻接点为起始点,建立相应的子生成树,并将其作为V 结点的子树链接到V结点上。显然,算法是一个递归算法。
(1) DFStree算法
typedef struct CSNode
{
ElemType data ;
struct CSNode *firstchild , *nextsibling ;
}CSNode ;
CSNode *DFStree(ALGraph *G , int v)
{
CSNode *T , *ptr , *q ;
LinkNode *p ;
int w ;
Visited[v]=TRUE ;
T=(CSNode *)malloc(sizeof(CSNode)) ;
T->data=G->AdjList[v].data ;
T->firstchild=T->nextsibling=NULL ; // 建立根结点
q=NULL ;
p=G->AdjList[v].firstarc ;
while (p!=NULL)
{
w=p->adjvex ;
if (!Visited[w])
{
ptr=DFStree(G,w) ; /* 子树根结点 */
if (q==NULL) T->firstchild=ptr ;
else q->nextsibling=ptr ;
q=ptr ;
}
p=p->nextarc ;
}
return(T) ;
}
(2) BFStree算法
typedef struct Queue
{
int elem[MAX_VEX] ;
int front , rear ;
}Queue ; /* 定义一个队列保存将要访问顶点 */
CSNode *BFStree(ALGraph *G ,int v)
{
CSNode *T , *ptr , *q ;
LinkNode *p ;
Queue *Q ;
int w , k ;
Q=(Queue *)malloc(sizeof(Queue)) ;
Q->front=Q->rear=0 ; /*建立空队列并初始化*/
Visited[v]=TRUE ;
T=(CSNode *)malloc(sizeof(CSNode)) ;
T->data=G->AdjList[v].data ;
T->firstchild=T->nextsibling=NULL ; // 建立根结点
Q->elem[++Q->rear]=v ; /* v入队 */
while (Q->front!=Q->rear)
{
w=Q->elem[++Q->front] ;
q=NULL ;
p=G->AdjList[w].firstarc ;
while (p!=NULL)
{
k=p->adjvex ;
if (!Visited[k])
{
Visited[k]=TRUE ;
ptr=(CSNode *)malloc(sizeof(CSNode)) ;
ptr->data=G->AdjList[k].data ;
ptr->firstchild=T->nextsibling=NULL ;
if (q==NULL) T->firstchild=ptr ;
else q->nextsibling=ptr ;
q=ptr ;
Q->elem[++Q->rear]=k ; /* k入对 */
} /* end if */
p=p->nextarc ;
} /* end while p */
} /* end whil Q */
return(T) ;
} /*求图G广度优先生成树算法BFStree*/
(3) 图的生成森林算法
CSNode *DFSForest(ALGraph *G)
{
CSNode *T , *ptr , *q ;
int w ;
for (w=0; w<G->vexnum; w++)
Visited[w]=FALSE;
T=NULL ;
for (w=0 ; w<G->vexnum ; w++)
if (!Visited[w])
{
ptr=DFStree(G, w) ;
if (T==NULL) T=ptr ;
else q->nextsibling=ptr ;
q=ptr ;
}
return(T) ;
}
在算法中,树的存储结构采用孩子—兄弟表示法。首先建立从某个顶点V出发,建立一个树结点,然后再分别以V的邻接点为起始点,建立相应的子生成树,并将其作为V 结点的子树链接到V结点上。显然,算法是一个递归算法。
(1) DFStree算法
typedef struct CSNode
{
ElemType data ;
struct CSNode *firstchild , *nextsibling ;
}CSNode ;
CSNode *DFStree(ALGraph *G , int v)
{
CSNode *T , *ptr , *q ;
LinkNode *p ;
int w ;
Visited[v]=TRUE ;
T=(CSNode *)malloc(sizeof(CSNode)) ;
T->data=G->AdjList[v].data ;
T->firstchild=T->nextsibling=NULL ; // 建立根结点
q=NULL ;
p=G->AdjList[v].firstarc ;
while (p!=NULL)
{
w=p->adjvex ;
if (!Visited[w])
{
ptr=DFStree(G,w) ; /* 子树根结点 */
if (q==NULL) T->firstchild=ptr ;
else q->nextsibling=ptr ;
q=ptr ;
}
p=p->nextarc ;
}
return(T) ;
}
(2) BFStree算法
typedef struct Queue
{
int elem[MAX_VEX] ;
int front , rear ;
}Queue ; /* 定义一个队列保存将要访问顶点 */
CSNode *BFStree(ALGraph *G ,int v)
{
CSNode *T , *ptr , *q ;
LinkNode *p ;
Queue *Q ;
int w , k ;
Q=(Queue *)malloc(sizeof(Queue)) ;
Q->front=Q->rear=0 ; /*建立空队列并初始化*/
Visited[v]=TRUE ;
T=(CSNode *)malloc(sizeof(CSNode)) ;
T->data=G->AdjList[v].data ;
T->firstchild=T->nextsibling=NULL ; // 建立根结点
Q->elem[++Q->rear]=v ; /* v入队 */
while (Q->front!=Q->rear)
{
w=Q->elem[++Q->front] ;
q=NULL ;
p=G->AdjList[w].firstarc ;
while (p!=NULL)
{
k=p->adjvex ;
if (!Visited[k])
{
Visited[k]=TRUE ;
ptr=(CSNode *)malloc(sizeof(CSNode)) ;
ptr->data=G->AdjList[k].data ;
ptr->firstchild=T->nextsibling=NULL ;
if (q==NULL) T->firstchild=ptr ;
else q->nextsibling=ptr ;
q=ptr ;
Q->elem[++Q->rear]=k ; /* k入对 */
} /* end if */
p=p->nextarc ;
} /* end while p */
} /* end whil Q */
return(T) ;
} /*求图G广度优先生成树算法BFStree*/
(3) 图的生成森林算法
CSNode *DFSForest(ALGraph *G)
{
CSNode *T , *ptr , *q ;
int w ;
for (w=0; w<G->vexnum; w++)
Visited[w]=FALSE;
T=NULL ;
for (w=0 ; w<G->vexnum ; w++)
if (!Visited[w])
{
ptr=DFStree(G, w) ;
if (T==NULL) T=ptr ;
else q->nextsibling=ptr ;
q=ptr ;
}
return(T) ;
}
相关文章推荐
- 无向图的联通分量和生成树(调用算法7.7、7.8,将无向图 构造为生成森林,并以孩子—兄弟二叉链表存储之)
- 由线性的List生成树状的List,森林的生成算法-Java实现
- java实现图的最小生成树(森林)MST克鲁斯卡尔(Kruskal)算法
- 图-生成树和生成森林算法C语言
- hdu 1162Eddy's picture Prime算法求最小生成树
- 在球面上随机生成分布点的算法(fortran)
- 旅游[SPFA或是最小生成树][简单算法的灵活题]
- 最小生成树 贪心算法思想
- 设有两个集合A和集合B,要求设计生成集合C=A∩B的算法,其中集合A、B和C用链式存储结构表示
- 控制点生成算法
- 【转】微博URL短网址生成算法原理及(java版、php版实现实例)
- 子集生成算法
- 基于高度图的三维地形生成算法入门篇 —— 均匀网格地形生成算法
- 反距离权重法生成DEM(利用KD-tree实现KNN算法)
- 随机森林算法原理小结
- 数据结构与算法之带权图的最小生成树
- [Sicily 1090 Highways] 求最小生成树的两种算法(普里姆算法/克鲁斯卡尔算法)
- OpenGL入门2——曲线生成算法
- POJ 1258 Agri-Net(最小生成树) && POJ 2377 Bad Cowtractors(最大生成树)
- 模板_krustra最小生成树算法