数据结构复习3:图算法实现常考点

在算法实现方面要求,熟练掌握图的两种遍历方法

DFSTraverse(G, v, Visit());

//从顶点v起深度优先遍历图G,并对每个顶点调用函数Visit一次且仅一次。

void  DFS( ALGraph *G , int v )//用邻接表实现,遍历图G中与顶点v相连的顶点

{   LinkNode  *p ;

Visited[v] = TRUE ; // 置访问标志,

visit(v) ;                    //访问顶点v

p = G->AdjList[v].firstarc;   //链表的第一个结点

while ( p != NULL )

{   if  ( !Visited[p->adjvex] )

          DFS( G,  p->adjvex ) ;

      p = p->nextarc ;//从v的未访问过的邻接顶点出发深度优先搜索

}   

}

void DFS_traverse_Graph(ALGraph *G)//遍历图G

{  int v ;

for ( v=0 ; v<G->vexnum ; v++ )

Visited[v] = FALSE ;    //访问标志初始化

for ( v=0 ; v<G->vexnum ; v++ )

if ( !Visited[v] )   DFS( G , v );

}

BFSTraverse(G, v, Visit());

//从顶点v起广度优先遍历图G,并对每

//个顶点调用函数Visit一次且仅一次。

void BFS_traverse_Grapg(ALGraph *G)

{              int k ,v , w ;

LinkNode  *p ;     Queue  *Q ;       Q = (Queue *)malloc(sizeof(Queue)) ;

Q->front = Q->rear = 0;          //建立空队列并初始化

for (k=0 ; k<G->vexnum ; k++)

Visited[k]=FALSE ;              //访问标志初始化

for (k=0 ; k<G->vexnum ; k++)

{      v = G->AdjList[k].data ;     //单链表的头顶点

       if ( !Visited[v] )                    //v尚未访问

      {      Q->elem[++Q->rear] = v ;    //v入队

        while (Q->front != Q->rear) //1 队列非空时

       {     w = Q->elem[++Q->front];//队首元素出队

              Visited[w] = TRUE ;           //置访问标志

              Visit(w) ;                              //访问队首元素

              p = G->AdjList[w].firstarc;

              while ( p != NULL )   //2 找出队元素的下一个邻接点

              {    if ( !Visited[p->adjvex] )

                        Q->elem[++Q->rear] = p->adjvex;//邻接点入队

                    p = p->nextarc ;

               }// end  while 2

         }   // end  while 1

  } //end  if 1

}  //end for 2

}

并能够根据图的基本原理解决一些应用问题,常考简答计算题:

判定图的连通性:最小生成树

(1) 统计各顶点入度的函数

void count_indegree(ALGraph *G)

{  int k ; LinkNode *p ;

for (k=0; k<G->vexnum; k++)

G->adjlist[k].indegree=0 ;     /*  顶点入度初始化  */

for (k=0; k<G->vexnum; k++)

{  p=G->adjlist[k].firstarc ;

while (p!=NULL)     /*  顶点入度统计  */

    {  G->adjlist[p->adjvex].indegree++ ;

        p=p->nextarc ;   

     }

}

}

判定是否有环:拓扑排序,拓扑序列

(2) 拓扑排序算法

int  Topologic_Sort(ALGraph *G, int topol[])

      /*  顶点的拓扑序列保存在一维数组topol中  */

{  int  k, no, vex_no, top=0, count=0, boolean=1 ;

int  stack[MAX_VEX] ;       /*  用作堆栈  */

LinkNode *p ;

count_indegree(G) ;   /*  统计各顶点的入度  */

for (k=0; k<G->vexnum; k++)

if  (G->adjlist[k].indegree==0)

stack[++top]=G->adjlist[k].data ;

do

{  if (top==0)  boolean=0 ;

else

    {   no=stack[top--] ;     /*  栈顶元素出栈  */

         topl[++count]=no ;    /*  记录顶点序列  */

         p=G->adjlist[no].firstarc ;

         while (p!=NULL)     /*删除以顶点为尾的弧*/

              {   vex_no=p->adjvex ;

                  G->adjlist[vex_no].indegree-- ;

                  if  (G->adjlist[vex_no].indegree==0)

                       stack[++top]=vex_no  ;

                  p=p->nextarc ;   

              }

    }

}while(boolean==0) ;

    if (count<G->vexnum)  return(-1) ;

   else  return(1) ;

}
发布了38 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_40165004/article/details/103597952
今日推荐