您的位置: 网站首页 > 程序开发 > 数据结构 > 第6章 图 > 【6.8 上 机 实 验】

6.8 上 机 实 验

 

6.8 

6.8.1  实验内容

1)假设图G采用邻接表存储,设计一个程序,判断无向图G是否连通。若连通则返回1;否则返回0

2)假设图G采用邻接表存储,设计一个程序,判断G中顶点i到顶点j是否有路径。若有返回1;否则返回0

3)编写对邻接表存储的从顶点vi出发的深度优先遍历图的非递归算法并上机实现。

6.8.2  实验指导

1采用图的遍历方式判断无向图G是否连通。这里用深度优先遍历方法,先给visited[ ]数组置初值0,然后从0顶点开始遍历该图。在一次遍历之后,若所有顶点ivisited[i]均为1,则该图是连通的;否则不连通。对应的算法如下:

int visited[MAXVEX];                    /*全局变量*/

int Connect(MyGraph *G)                 /*判断无向图G的连通性*/

{

    int i,flag=1;

    for(i=0;i<G->n;i++)                 /*visited数组置初值*/

        visited[i]=0;

    DFS(G,0);                   /*调用前面的DFS算法,从顶点0开始深度优先遍历*/

    for(i=0;i<G->n;i++)

        if(visited[i]==0)

        {  

            flag=0;

            break;

        }

    return flag;

}

注意:本例也可以采用广度优先遍历算法求解,只需将调用DFS(G,0)改为调用BFS(G,0)

2)采用图的遍历方式判断图G是否连通。这里用深度优先遍历方法,先给visited[ ]数组置初值0,然后从i顶点开始遍历该图,在遍历完成后,若顶点j已访问,说明顶点i到顶点j存在路径,否则说明顶点i到顶点j不存在路径。对应的算法如下:

int visited[MAXVEX];                    /*全局变量*/

int Connect(MyGraph *G,int i,int j)     /*判断顶点i到顶点j是否有路径*/

{

    int k;

    for(k=0;k<G->n;k++)                 /*visited数组置初值*/

        visited[k]=0;

    DFS(g,i);               /*调用前面的DFS算法,从顶点i开始深度优先遍历*/

    if(visited[j]==1)

       return(1);

    else

        return(0); 

}

注意:本例也可以采用广度优先遍历算法求解,只需将调用DFS(G,i)改为调用BFS (G,i)

3)在非递归算法中另设一个顺序栈s[MaxV],保存当前访问顶点的邻接顶点的指针,就可以由这个指针依次找到当前访问顶点的所有邻接顶点。退栈元素的某个邻接顶点进行访问时,首先将下一个邻接顶点的指针进栈,再将这个邻接顶点作为当前顶点,重复该过程,直到栈为空,将所有与出栈顶点有路径的顶点全访问完。按深度优先遍历图的算法描述如下:

#define MaxV 100

void bfsl (ALGraph *G)

{

   int i,j,top,visited[MaxV];

   Enode *p,*s[MaxV];

   for(i=0;i<G->n;i++)

      visited[i]=0;

   for(i=0;i<G->n;i++)

      if(visited[i]==0)

      {

         top=0;

         visited[i]=1;

         printf("%c",G->adjlist[i].data);

         s[top++]=G->adjlist[i].firste;

         while(top>0)

         {

            p=s[--top;

            if(p)

              {

                 s[top++]=p->next;

                 j=p->adjivex;

                 if(Visited[j]==0)

                {

                   visited[j]=1;

                   printf("%c",G->adjlist[j].data);

                   s[top++]=G->adjlist[j].firste;

                }

            }

         }

      }

}