图的广度优先遍历

来源:互联网 发布:网络运营需要学什么 编辑:程序博客网 时间: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
原创粉丝点击