图的深度优先和广度优先算法(DFS递归与非递归)

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

               

本博客前面文章已对图有过简单的介绍,本文主要是重点介绍有关图的一些具体操作与应用

阅读本文前,可以先参考本博客 各种基本算法实现小结(四)—— 图及其遍历   和  图的一些基本算法

 

无向图——邻接矩阵的深度优先和广度优先算法实现

测试环境:VS2008(C)

#include "stdafx.h"#include #include #define INFINITY INT_MAX#define MAX_VEX 20#define VRType int#define VertexType char#define InfoType intint *visited;/********************************//****      图的结构定义      ****//********************************/typedef enum{ DG,  DN, UDG, UDN}GraphKind;struct _ArcCell{ VRType adj; /* note weight */ InfoType *info;};typedef struct _ArcCell ArcCell, AdjMatrix[MAX_VEX][MAX_VEX];struct _MGraph{ VertexType vexs[MAX_VEX]; AdjMatrix arcs; int vexnum, arcnum; GraphKind kind;};typedef struct _MGraph MGraph;/********************************//****      栈的结构定义      ****//********************************/struct _node{ int ivex; struct _node *next;};typedef struct _node node, *pnode;struct _stack{ int size; pnode ptop;};typedef struct _stack stack, *pstack;/********************************//****      堆的结构定义      ****//********************************/struct _queue{ pnode front; pnode rear;};typedef struct _queue queue, *pqueue;/********************************//****         栈的实现       ****//********************************/pstack init_stack(int size){ pnode pn=NULL; pstack ps=NULL; pn=(pnode)malloc(sizeof(node)); ps=(pstack)malloc(sizeof(stack)); pn->ivex=-1; pn->next=NULL; ps->size=size; ps->ptop=pn; return ps;}int empty_stack(pstack ps){ if(ps->ptop->next==NULL)  return 1; else  return 0;}void push_stack(pstack ps, int ivex){ pnode pn=NULL; pn=(pnode)malloc(sizeof(node)); pn->ivex=ivex; pn->next=ps->ptop; ps->ptop=pn;}int pop_stack(pstack ps){ int ivex=-1; pnode pn=NULL; if(!empty_stack(ps)) {  pn=ps->ptop;  ps->ptop=ps->ptop->next;  ivex=pn->ivex;  free(pn); } return ivex;}/********************************//****         堆的实现       ****//********************************/queue init_queue(){ pnode pn=NULL; queue qu; pn=(pnode)malloc(sizeof(node)); pn->next; pn->ivex=-1; qu.front=qu.rear=pn; return qu;}int empty_queue(queue qu){ if(qu.front==qu.rear)  return 1; else  return 0;}void en_queue(queue qu, int ivex){ pnode pn=NULL; pn=(pnode)malloc(sizeof(node)); pn->ivex=ivex; pn->next=qu.rear->next; qu.rear=pn;}int de_queue(queue qu){ int ivex=-1; pnode pn=NULL; if(!empty_queue(qu)) {  pn=qu.front;  qu.front=qu.front->next;  ivex=pn->ivex;  free(pn); } return ivex;}/********************************//****         图的实现       ****//********************************/int LocateVex(MGraph g, char ch){ int i; for(i=1; i<=g.vexnum; i++)  if(ch==g.vexs[i])   return i; return -1;}MGraph Create_UDG(){ int i, j, w, p1, p2; char ch1, ch2; MGraph g; printf("Enter vexnum arcnum: "); scanf("%d %d", &g.vexnum, &g.arcnum); getchar(); for(i=1; i<=g.vexnum; i++)  for(j=1; j<=g.vexnum; j++)   g.arcs[i][j].adj=g.arcs[j][i].adj=INFINITY; /* UDG should define i-j and j-i */ printf("Enter %d vex.../n", g.vexnum); for(i=1; i<=g.vexnum; i++) {  printf("vex %d: ", i);  scanf("%c", &g.vexs[i]);  getchar(); } printf("Enter %d arc.../n", g.arcnum); for(i=1; i<=g.arcnum; i++) {  printf("arc %d: ", i);  scanf("%c %c %d", &ch1, &ch2, &w);  getchar();  p1=LocateVex(g, ch1);  p2=LocateVex(g, ch2);  g.arcs[p1][p2].adj=g.arcs[p2][p1].adj=w; } return g;}int FirstVex(MGraph g, int i){ int k; if(i>=1 && i<=g.vexnum)  for(k=1; k<=g.vexnum; k++)   if(g.arcs[i][k].adj!=INFINITY)    return k; return -1;}int NextVex(MGraph g, int i, int j){ int k; if(i>=1 && i<=g.vexnum && j>=1 && j<=g.vexnum)  for(k=j+1; k<=g.vexnum; k++)   if(g.arcs[i][k].adj!=INFINITY)    return k; return -1;}void DFS(MGraph g, int i){ int j; if(!visited[i]) {  visited[i]=1;  printf("%3c", g.vexs[i]);  for(j=FirstVex(g, i); j>=1; j=NextVex(g, i, j))   if(!visited[j])    DFS(g, j); }}void DFS_Graph(MGraph g){ int i; visited=(int *)malloc((g.vexnum+1)*sizeof(int)); for(i=1; i<=g.vexnum; i++)  visited[i]=0; for(i=1; i<=g.vexnum; i++)  if(!visited[i])   DFS(g, i);}void DFS2_Graph(MGraph g){ int i, j, k; pstack ps=NULL; ps=init_stack(g.vexnum); visited=(int *)malloc((g.vexnum+1)*sizeof(int)); for(i=1; i<=g.vexnum; i++)  visited[i]=0; for(i=1; i<=g.vexnum; i++)  if(!visited[i])  {   visited[i]=1;   printf("%3c", g.vexs[i]);   push_stack(ps, i);   k=i;   while (!empty_stack(ps))   {      for(j=FirstVex(g, k); j>=1; j=NextVex(g, k, j))    {     if(!visited[j])     {      visited[j]=1;      printf("%3c", g.vexs[j]);      push_stack(ps, j); /* push all visited ivex */      k=j; /* newer node */     }         }    k=pop_stack(ps);   }  }}void BFS_Graph(MGraph g){ int i, j, k; queue qu; qu=init_queue(); visited=(int *)malloc((g.vexnum+1)*sizeof(int)); for(i=1; i<=g.vexnum; i++)  visited[i]=0; for(i=1; i<=g.vexnum; i++)  if(!visited[i])  {   visited[i]=1;   printf("%3c", g.vexs[i]);   en_queue(qu, i);   while (!empty_queue(qu))   {    k=de_queue(qu);    for(j=FirstVex(g, k); j>=1; j=NextVex(g, k, j))     if(!visited[j])     {      visited[j]=1;      printf("%3c", g.vexs[j]);      en_queue(qu, j);     }   }  }}/********************************//****          主函数        ****//********************************/int _tmain(int argc, _TCHAR* argv[]){ MGraph g; g=Create_UDG(); printf("/nDFS: ");  DFS_Graph(g);       /* recursion */ printf("/nDFS: ");  DFS2_Graph(g);      /* non recursion */ printf("/nBFS: "); BFS_Graph(g); printf("/n"); return 0;}

运行结果:

    

 


           

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

你可能感兴趣的:(图的深度优先和广度优先算法(DFS递归与非递归))