无向图的生成树和生成森林算法
来源:互联网 发布:推荐秋冬用的面霜知乎 编辑:程序博客网 时间:2024/04/28 22:06
对图的深度优先搜索遍历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) ;
}
- 无向图的生成树和生成森林算法
- 无向图的联通分量和生成树(调用算法7.7、7.8,将无向图 构造为生成森林,并以孩子—兄弟二叉链表存储之)
- prime算法求无向图的最小生成树
- 无向网图的最小生成树--普里姆算法
- 无向图的最小生成树(prim算法)
- 图-生成树和生成森林算法C语言
- 无向图中的深度优先生成森林
- 无向图中的广度优先生成森林
- 【数据结构】算法7.7-7.8 无向图的连通分量和生成树
- 无向图的连通分量和生成树
- 无向图的生成
- 51nod 1212 无向图最小生成树(prim算法和kruska算法) 新手小结
- 无向网的最小生成树(Prim算法)
- 无向网的最小生成树(Kruskal算法)
- 生成树和生成森林
- 贪心算法_无向图最小生成树*
- 无向图最小生成树(prim算法)
- 无向图的最小生成树算法的C程序实现代码(Prim算法)
- 深度优先搜索算法
- 广度优先搜索算法
- C#中ToString格式大全
- 关于iOS5 + XCode4.2环境下iPhone3G和3Gs + iOS4.2.1不能调试的问题解决方案整理
- python 和 c 的结合
- 无向图的生成树和生成森林算法
- How to register iSupport users in R12
- 有向图的强连通分量
- java web 开发入门心得
- GEF、SWT、JFace、RCP学习心得
- 普里姆(Prim)算法
- IIS+PHP+MySQL+phpMyAdmin 配置PHP服务器详解
- 经典SQL语句大全
- 如何利用crash report来定位出错的代码(Steps to analyze crash report from apple)