无向图的深度优先遍历和广度优先遍历(邻接链表)

来源:互联网 发布:软件打不开是怎么了 编辑:程序博客网 时间:2024/05/23 19:19

我选的是邻接链表,建立如下图所示的图:


我把它画出来,图是这样子的:



对于深度优先遍历:是从一个顶点v出发,一步一步地向前推进,当找不到未访问过的顶点时,也是一步一步地回退。其过程类似于用栈求解迷宫问题的搜索方式。


比如上面这个图:我从4这个顶点开始遍历,它先访问它第一个邻接点1,然后1访问它的第一个邻接点4,发现4已经访问过了,然后访问第二个邻接点2,2访问第一个邻接点1,发现1已经被访问过,回退到1,1访问第三个邻接点3,3的第一个第二个邻接点已经被访问,我们就不访问它,最后回退到4,4访问第二个邻接点3,可是3已经被访问,我们就不访问了。


对于广度优先遍历:是从一个顶点v出发,先访问其所有相邻的未访问过的顶点。相当于以初始点为中心,一层一层地向外推进的。其过程类似于用队列求解迷宫问题的搜索方式。


比如上面这个图:我从4这个顶点开始访问,先访问1,接着访问3,然后访问和3相邻的顶点4、1,4、1都被访问过,回退访问1相邻的未访问的顶点1。



我是这样理解的,读者可以根据自己的测试数据来理解,欢迎和我交流。


完整代码:

    #include <stdio.h>      #include <conio.h>      #include <malloc.h>      #define MAX_NUM 20      typedef struct ArcNode {          int adjvex;          struct ArcNode *nextarc;      }ArcNode;      typedef int VertexType;      typedef struct VNode {          VertexType data;          ArcNode *firstarc;      }VNode,AdjList[MAX_NUM];      void createDgraph(AdjList &g,int n){          ArcNode *p,*q;          int i,j;          for (i=1;i<=n;i++)          {              g[i].data=i;              g[i].firstarc=NULL;          }          printf("\nEdgei->j:");          scanf("%d%d",&i,&j);          while (i!=-1)          {              p=(ArcNode *)malloc(sizeof(ArcNode));  q=(ArcNode *)malloc(sizeof(ArcNode));              p->adjvex=j;              p->nextarc=g[i].firstarc;              g[i].firstarc=p;   q->adjvex=i;              q->nextarc=g[j].firstarc;              g[j].firstarc=q;              printf("\nEdge i->j:");              scanf("%d%d",&i,&j);          }      }  int visited[MAX_NUM]={0};void DFS(AdjList G,int v){ArcNode *p;visited[v]=1;printf("%d ",v);p=G[v].firstarc;while(p!=NULL){if(visited[p->adjvex]==0){//若w=p->adjvex 顶点未访问,递归访问它DFS(G,p->adjvex);}p=p->nextarc;//p指向顶点v的下一个邻接点}}void BFS(AdjList G,int v){ArcNode *p;int Qu[20],front,rear;//定义循环队列int visited[20]={0};int w,i;front=rear=0;//初始化队列printf("%d ",v);visited[v]=1;rear=(rear+1)%20;Qu[rear]=v;//v进队while(front!=rear){front=(front+1)%20;w=Qu[front];//出队并赋给wp=G[w].firstarc;//找与顶点w邻接的第一个顶点while(p){if(visited[p->adjvex]==0){//弱当前顶点未被访问printf("%d ",p->adjvex);//访问邻接顶点visited[p->adjvex]=1;rear=(rear+1)%20;//该顶点进队Qu[rear]=p->adjvex;}p=p->nextarc;}}}    void printDgraph(AdjList g,int n){          ArcNode *p;          int i;          for (i=1;i<=n;i++)          {              printf("\n%d: ",g[i].data);              p=g[i].firstarc;              while (p)              {                  printf("->%d",p->adjvex);                  p=p->nextarc;              }          }      }      int main()      {          AdjList g;          int num;          printf("Input Number of Vertex:");          scanf("%d",&num);          createDgraph(g,num);          printDgraph(g,num);          printf("\n");  printf("深度优先:");DFS(g,num);printf("\n");printf("广度优先:");BFS(g,num);printf("\n");        return 0;      }  




对于图的管

0 0
原创粉丝点击