zoukankan      html  css  js  c++  java
  • 图结构的深度优先遍历与广度优先遍历

    前言

    本文讨论的为简单图结构,不存在顶点到其自身的边,并且同一条边比重复出现。

    数据结构定义

    //边表节点
    class ArcNode
    {
    	public int adjvex;     //邻接点域
    	public ArcNode next;
    }
    
    //顶点表节点
    class VertexNode<T>
    {
    	public T vertex;
    	public ArcNode firstedge;
    }
    

    深度优先遍历

    思路

    • 访问顶点root
    • 从顶点root上没有被访问过的邻接点中选取一个顶点v,从v出发再次进行深度优先遍历
    • 重复上面两个步骤,直到图中所有与root路径相通的顶点都被访问到

    核心方法:递归

    代码

    public void DFSTraverse(int v)
    {
    	ArcNode p = null;
    	int j;
    	Console.WriteLine(adjlist[v].vertex); //访问顶点
    	visited[v] = 1;  //将顶点标记为已经访问过
    	p = adjlist[v].firstedge; //工作指针p指向顶点v的边表
    
    	//依次搜索顶点v的邻接点j
    	while (p != null)
    	{
    		j = p.adjvex;
    		if (visited[j] == 0)      //如果未被放问过则继续遍历
    			DFSTraverse(j);
    		p = p.next;
    	}
    }
    

    广度优先遍历、

    思路

    • 从某个顶点root出发,访问root
    • 依次访问root的各个没有被访问过的邻接点 a,b,c,d,e,f,g...
    • 分别从 a,b,c,d,e,f,g..出发依次访问它们未被访问的邻接点,并且使先被访问顶点的邻接点先于后被访问顶点的邻接点。直到图中所有顶点遍历完成

    核心方法:循环

    代码

    public void BFSTraverse(int v)
    {
    	//使用队列实现,假设队列使用顺序存储
    	int[] Q = new int[Program.MaxSize];
    	int front = -1, rear = 1;           //初始化队列
    
    	ArcNode p = null;
    	Console.WriteLine(adjlist[v].vertex);
    
    	//被访问过的顶点入队
    	visited[v] = 1;
    	Q[++rear] = v;
    
    	//当队列非空时
    	while (front != rear)
    	{
    		v = Q[++front];
    		p = adjlist[v].firstedge;       //工作指针p指向顶点v的边表
    		while (p != null)
    		{
    			int j = p.adjvex;          //j是顶点v的邻接点
    			if (visited[j] == 0)
    			{
    				Console.WriteLine(adjlist[j].vertex);
    				visited[j] = 1;
    				Q[++rear] = j;
    			}
    			p = p.next;
    		}
    	}
    }
    
  • 相关阅读:
    SQL:获取语句执行时间
    好的学习网站和app推荐
    Javascript作业—数组去重(要求:原型链上添加函数)
    Javascript作业—封装type函数,返回较详细的数据类型
    Javascript作业—取字符串的第一个只出现一次的字母
    Javascript作业—数字转化为大写
    HTML入门2—HTML常用标签
    ubuntu 设置静态IP
    centos7 设置 静态IP
    运维常用命令
  • 原文地址:https://www.cnblogs.com/deali/p/7788294.html
Copyright © 2011-2022 走看看