从最小支撑树和最短路径树学习图的优先级搜索

本文介绍了图的优先级搜索(PFS),它是基于广度优先搜索和深度优先搜索的抽象,通过优先级选择节点。文章以最小支撑树(Prim算法)和最短路径树(Dijkstra算法)为例,详细阐述了这两个经典算法的原理和应用,并提供了算法的执行过程。
摘要由CSDN通过智能技术生成

在介绍最小支撑树和最短路径树之前,先对图的优先级搜索有个简单的了解,前面笔者介绍了图的广度优先搜索算法图的深度优先搜索。这两种搜索虽然各有特点,但基本结构却几乎相同。都需要通过迭代逐一发现各顶点,将其归纳到遍历树中做相应的处理。两种算法的唯一差别在于,如何选取下一个节点的问题。对于广度优先搜索则为选取更早被发现的节点,而深度优先搜索则为最后被发现的节点。

如果将广度优先搜索或深度优先搜索选取下一个节点的策略抽象为根据优先级来选取。每一步迭代选取的节点都是当前所有邻居中优先级的一个极值(或优先级最高,或优先级最低)。因此,这种按照优先级来选取下一个节点的搜索过程就称为优先级搜索—PFS,亦称为最佳优先搜索。

按照上述的思路,抽象出PFS搜索的框架如下:
对节点添加优先级数:priority字段,默认值为Integer.MAX_VALUE。优先级数越高,优先级越低

    private int priority = Integer.MAX_VALUE; //优先级数越高,优先级越低
    public int getPriority() {
        return priority;
    }

    public void setPriority(int priority) {
        this.priority = priority;
    }

PFS:

  public void pfsTree(int index){
      int v = index;
      do{
          if(allNodes[v].getStatus() == 0 ){
              this.pfs(v);
          }
      }while(index != (v = (++v%size)));//存在孤立节点,继续一次pfs遍历
  }

  public void pfs(int v){
     this.allNodes[v].setPriority(0);//该次pfs树中优先级最高的树
     this.allNodes[v].setStatus(2); //VISITED
     this.allNodes[v].setParent(-1);

     while(true){
         //遍历v的所有邻居,根据不同的策略,基于不同的优先级
          for(int i=0;i<size;i++) {
              if(getEdge(v, i)!=null) {
                  //如果节点i尚未被发现
                  if(allNodes[i].getStatus() == 0) {
                      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值