图的遍历

图的遍历方式:

图的遍历算法是图的连通性问题、拓扑排序、求关键路径等问题的基础。

1.深度优先搜索Depth First Search  DFS
树的先根遍历的推广。

Boolean visted[MAX];  //使用访问标识数组
Status (*VisitFunc)(int v);

void DFSTraverse(Graph G,Status (*Visit)(int v)){
 VisitFuc = Visit;
 for(v = 0; v < G.vexnum; ++v) visited[v] = FALSE;
   for(v = 0; v < G.vexnum; ++v)
  if(!visited[v])  DFS(G,v);
}

//递归方法深度优先遍历图
void DFS(Graph G,int v){
 visited[v] = TRUE;
   VisitFunc(v);
   for(w = FirstAdjVex(G,v);w;w =NexAdjVex(G,v,w))
  if(!visited[w])  DFS(G,w);
}

遍历图的过程实际上查找邻接点的过程。时间复杂度取决于图的存储结构。
1.二维数组表示法:根据已有的结点查找邻接点,每次遍历数组此结点对应的那一行,
                  那么每一个结点相当于遍历二维数组的每一行,o(n*n)
2.邻接表表示法:n个结点和e个边或弧,o(n+e)

2.广度优先遍历 Breadth First Search  BFS
  类似于树的层次查找,由近及远,先访问距离短的顶点,且先访问的顶点的所有邻接点也优先访问。
  类似于树的层级遍历,借用队列存储已经访问的的顶点。
  void BFSTraverse(Graph G,Status (*Visit)(int v)){
  for(v = 0; v < G.vexnum; v++) visited[v] = FALSE;
          InitQueue(Q);
          for(v = 0; v < G.vexnum; v++){
   if(!visited[v]){
    Visit(v); visied[v] = TRUE; EnQueue(Q,v);
   }
   while(!QueueEmpty()){
    DeQueue(Q,v);
                       for(w = FirstAdjVex(G,v); w ; w = NextAdjVex(G,v,w)){
     if(!visited[w]){
      Visited(w);  visited[w] = TRUE;
      EnQueue(G,w);
     }
    }
   }
  }
 }

广度优先搜索法与深度优先搜索法时间复杂度相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值