图的广度优先遍历
来源:互联网 发布:网络运营需要学什么 编辑:程序博客网 时间:2024/04/29 22:05
图的广度优先遍历与二叉树的层序遍历思想类似,原理见代码:
void BFS(int v){node_ptr w;queue_ptr front,rear;front = rear = NULL;Visit(v);visited[v] = TRUE;addq(&front,&rear,v);while(front){v = deleteq(&front);printf("->%d<-\n",v);for(w=graph[v];w;w=w->link)if(!(visited[w->vertex])){Visit(w->vertex);addq(&front,&rear,w->vertex);visited[w->vertex] = TRUE;}}}测试程序:
#include <stdio.h>#include <malloc.h>#define MAX_VERTEX_NUM 50 #define FALSE 0#define TRUE 1typedef struct node* node_ptr;typedef struct node{int vertex;node *link;}node;node_ptr graph[MAX_VERTEX_NUM];short int visited[MAX_VERTEX_NUM];typedef struct queue *queue_ptr;typedef struct queue{int vertex;queue_ptr link;}queue;void addq(queue_ptr *Qhead,queue_ptr*Qrear,int v){queue_ptr pt = (queue_ptr)malloc(sizeof(queue));pt->vertex = v;pt->link = NULL;if(*Qhead == NULL){*Qhead = *Qrear = pt;}else{(*Qrear)->link = pt;(*Qrear) = pt;}}int deleteq(queue_ptr *Qhead){if(*Qhead){int v = (*Qhead)->vertex;queue_ptr pt = (*Qhead)->link;free(*Qhead);*Qhead = pt;return v; }return -1;}void ResetVisited(short int visited[],int node_num){for (int i=0;i<node_num;i++)visited[i] = FALSE;}void BuildGraph(node_ptr *graph,int node_num){//InitGraph(graph,node_num);int v;for(int i=0;i<node_num;i++){while(1){scanf("%d",&v);if(v == -1){break;}else{/*insert to head*/ node_ptr ptr = (node_ptr)malloc(sizeof(node)) ;ptr->vertex = v - 1;ptr->link = graph[i];graph[i] = ptr;}}}}void GraphShow(node_ptr *graph,int node_num){for(int i=0;i<node_num;i++){node_ptr tmp = graph[i];printf("%d",i+1);while(tmp) {printf("->%d",tmp->vertex+1);tmp = tmp->link;}printf("->#\n");}}void ClearGraph(node_ptr *graph,int node_num){for(int i=0;i<node_num;i++){node_ptr tmp = graph[i];while(tmp){graph[i] = tmp->link;free(tmp);tmp = graph[i];}//graph[i] = NULL;} }void Visit(int v){printf("Visiting Vertex : %d\n",v+1);}void DFS(int v){node_ptr p;visited[v] = TRUE;Visit(v);for(p=graph[v];p;p=p->link)if(!(visited[p->vertex]))DFS(p->vertex);}void BFS(int v){node_ptr w;queue_ptr front,rear;front = rear = NULL;Visit(v);visited[v] = TRUE;addq(&front,&rear,v);while(front){v = deleteq(&front);//printf("->%d<-\n",v);for(w=graph[v];w;w=w->link)if(!(visited[w->vertex])){Visit(w->vertex);addq(&front,&rear,w->vertex);visited[w->vertex] = TRUE;}}}int main(){ResetVisited(visited,5);ClearGraph(graph,5);BuildGraph(graph,5);GraphShow(graph,5);printf("DFS:\n");DFS(3);ResetVisited(visited,5);printf("BFS:\n");BFS(3);ClearGraph(graph,5);}测试输入:
2 3 -14 1 -11 4 -12 3 5 -14 -1测试输出:
1->3->2->#2->1->4->#3->4->1->#4->5->3->2->#5->4->#DFS:Visiting Vertex : 4Visiting Vertex : 5Visiting Vertex : 3Visiting Vertex : 1Visiting Vertex : 2BFS:Visiting Vertex : 4Visiting Vertex : 5Visiting Vertex : 3Visiting Vertex : 2Visiting Vertex : 1
REF:
1,数据结构(C语言版) Ellis Horowitz
0 0
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的遍历-(深度优先&广度优先)
- 图的遍历:深度优先、广度优先
- 图的遍历-广度优先遍历
- 图的遍历- 广度优先遍历
- 图:图的遍历(深度优先遍历、广度优先遍历)
- 生活源动力
- UIButton 的点击事件
- exVim :: 安装流程记录 & 个人配置备份 & 配色备份
- 关于同一交换机下设置不同网段的PC的通信的猜测
- 微探之Servlet
- 图的广度优先遍历
- MySQL在大型网站的应用架构演变
- javascript之作用域
- 【Matlab】优化工具箱使用详解
- 机器学习常见算法分类汇总
- ural 1143. Electric Path 凸多边形哈密顿回路
- 用于不相交集合的数据操作——并查集
- 虚拟机无法打开磁盘 "或者某一个快照所依赖的磁盘 原因:未能锁定文件"的解决办法
- UISegment使用