无向图的深度优先遍历和广度优先遍历(邻接链表)
来源:互联网 发布:软件打不开是怎么了 编辑:程序博客网 时间: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
- 无向图的深度优先遍历和广度优先遍历(邻接链表)
- 无向图深度优先遍历和广度优先遍历
- 邻接图的广度优先遍历和深度优先遍历
- 邻接表-图的遍历-广度和深度优先遍历
- 无向图的深度优先遍历和广度优先遍历(递归)
- 无向图的深度和广度优先遍历(javascript)
- 无向图的深度和广度优先遍历
- c语言编程 输出一个无向图的邻接表,邻接矩阵,进行深度和广度优先遍历
- 无向图邻接表的深度优先遍历(DFS)
- 无向图邻接表的深度优先遍历
- 图邻接表存储 深度优先和广度优先遍历
- 图的深度优先和广度优先遍历算法(用邻接表作为存储结构)
- 图(邻接表)的深度、广度优先遍历
- 邻接表实现--图的深度优先遍历DFS和广度优先遍历BFS
- 邻接表的深度优先遍历以及广度优先遍历
- 图: 广度深度优先遍历(邻接表)
- 邻接表存储图,深度和广度优先遍历
- 基于邻接表储存的图的深度优先和广度优先遍历
- 苹果Swift语言入门教程
- message type '' display like ''的意思
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- Instance渲染技术
- SVN提交被忽略的链接库文件(.a,.so)
- 无向图的深度优先遍历和广度优先遍历(邻接链表)
- 对对象进行序列化以及反序列化操作
- jmeter正则表达式提取器
- Win7 x64 PL/SQL 连接 Oralce 提示 Could not initialize "%ORACLE_HOME%\bin\oci.dll"
- jquery好久没有写了
- 用Qt制作的Android独立游戏《吃药了》发布
- 如何为Android写一个PhoneGap插件
- 深入MySQL源码—Step By Step
- Android 线程 Looper.prepare()、Looper.loop();