第十二周项目3-图遍历算法实现

来源:互联网 发布:2017经典网络流行语言 编辑:程序博客网 时间:2024/06/03 03:54
  1. /*    
  2. Copyright (c)2016,烟台大学计算机与控制工程学院    
  3. All rights reserved.    
  4. 文件名称:第十二周项目3 - 图遍历算法实现.cpp    
  5. 作    者:朱建豪    
  6. 完成日期:2016年11月18日    
  7. 版 本 号:v1.0    
  8.     
  9. 问题描述: 实现图遍历算法,分别输出如下图结构的深度优先(DFS)遍历序列和广度优先遍历(BFS)序列。     
  10. 输入描述: 若干测试数据。    
  11. 程序    


深度优先遍历(DFS):

源文件代码:

[cpp] view plain copy
  1. #include"head.h"    
  2. extern visited[MAXV];    
  3. void DFS(ALGraph *G, int v)    
  4. {    
  5.     ArcNode *p;    
  6.     int w;    
  7.     visited[v]=1;    
  8.     printf("%d ", v);    
  9.     p=G->adjlist[v].firstarc;    
  10.     while (p!=NULL)    
  11.     {    
  12.         w=p->adjvex;    
  13.         if (visited[w]==0)    
  14.             DFS(G,w);    
  15.         p=p->nextarc;    
  16.     }    
  17. }    
主函数代码:

[cpp] view plain copy
  1. #include"head.h"    
  2. int visited[MAXV];    
  3. int main()    
  4. {    
  5.     int i;    
  6.     ALGraph *G;    
  7.     int A[5][5]=    
  8.     {    
  9.         {0,1,0,1,0},    
  10.         {1,0,1,0,0},    
  11.         {0,1,0,1,1},    
  12.         {1,0,1,0,1},    
  13.         {0,0,1,1,0}    
  14.     };    
  15.     ArrayToList(A[0], 5, G);    
  16.     
  17.     for(i=0; i<MAXV; i++)     
  18.         visited[i]=0;    
  19.     printf(" 由2开始深度遍历:");    
  20.     DFS(G, 2);    
  21.     printf("\n");    
  22.     
  23.     for(i=0; i<MAXV; i++)     
  24.         visited[i]=0;    
  25.     printf(" 由0开始深度遍历:");    
  26.     DFS(G, 0);    
  27.     printf("\n");    
  28.     return 0;    
  29. }    
运行结果:

广度优先遍历(BFS):

源文件代码:

[cpp] view plain copy
  1. #include"head.h"    
  2. extern visited[MAXV];    
  3. void BFS(ALGraph *G, int v)    
  4. {    
  5.     ArcNode *p;    
  6.     int w,i;    
  7.     int queue[MAXV],front=0,rear=0; //定义循环队列    
  8.     int visited[MAXV];     //定义存放节点的访问标志的数组    
  9.     for (i=0; i<G->n; i++) visited[i]=0; //访问标志数组初始化    
  10.     printf("%2d",v);            //输出被访问顶点的编号    
  11.     visited[v]=1;                       //置已访问标记    
  12.     rear=(rear+1)%MAXV;    
  13.     queue[rear]=v;              //v进队    
  14.     while (front!=rear)         //若队列不空时循环    
  15.     {    
  16.         front=(front+1)%MAXV;    
  17.         w=queue[front];             //出队并赋给w    
  18.         p=G->adjlist[w].firstarc;   //找w的第一个的邻接点    
  19.         while (p!=NULL)    
  20.         {    
  21.             if (visited[p->adjvex]==0)    
  22.             {    
  23.                 printf("%2d",p->adjvex); //访问之    
  24.                 visited[p->adjvex]=1;    
  25.                 rear=(rear+1)%MAXV; //该顶点进队    
  26.                 queue[rear]=p->adjvex;    
  27.             }    
  28.             p=p->nextarc;       //找下一个邻接顶点    
  29.         }    
  30.     }    
  31.     printf("\n");    
  32. }    
主函数代码:

[cpp] view plain copy
  1. #include"head.h"    
  2. int visited[MAXV];    
  3.     
  4. int main()    
  5. {    
  6.     ALGraph *G;    
  7.     int A[5][5]=    
  8.     {    
  9.         {0,1,0,1,0},    
  10.         {1,0,1,0,0},    
  11.         {0,1,0,1,1},    
  12.         {1,0,1,0,1},    
  13.         {0,0,1,1,0}    
  14.     };    
  15.     ArrayToList(A[0], 5, G);    
  16.     
  17.     printf(" 由2开始广度遍历:");    
  18.     BFS(G, 2);    
  19.     
  20.     printf(" 由0开始广度遍历:");    
  21.     BFS(G, 0);    
  22.     return 0;    
  23. }    

运行结果:


知识点总结:

DFS和BFS的算法实现。

0 0
原创粉丝点击