如何进行广度优先搜索

如何进行广度优先搜索

我已经使用哈希图链接列表实现了一个图,并且我想添加包含权重的边,以确定从一个国家到另一个国家旅行的总费用
例如:-英国-迪拜60000等

    public class Edge {
    Vertex from;
    Vertex to;
    String al;
    double weight;

    public Edge(Vertex from , Vertex to , String al,double weight)
    {
        this.from = from;
        this.to = to;
        this.al = al;
        this.weight = weight;
    }

    public void printEdge()
    {
        System.out.println(" FROM : " + from.name + " TO : " + to.name + " AirLine name : |"+al+"| " + "PRICE :- " + weight+"LKR");
    }

}

    public class Vertex {
    String name;
    public Vertex(String name)
    {
        this.name = name;
    }

}

    package GraphTEST;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;

public class Graph {

    private Map<Vertex , LinkedHashSet<Vertex>> map = new HashMap<>();

        //Arraylist to store the edges
        public ArrayList<Edge> edges = new ArrayList<Edge>();

    public void addEdge(Vertex n1 , Vertex n2)
    {
        LinkedHashSet<Vertex> adjacentz = map.get(n1);
        if(adjacentz==null)
        {
            adjacentz = new LinkedHashSet<>();
            map.put(n1, adjacentz);
        }
        adjacentz.add(n2);
    }

        public void addEDGE(Vertex n1, Vertex n2 , String al, double weight)
        {
            Edge e = new Edge(n1, n2, al, weight);
            edges.add(e);


            LinkedHashSet<Vertex> adjacentz = map.get(n1);
        if(adjacentz==null)
        {
            adjacentz = new LinkedHashSet<>();
            map.put(n1, adjacentz);
        }
        adjacentz.add(n2);
        }

        public void printAll()
        {
            for(int i =0;i < edges.size() ;i++)
            {
               edges.get(i).printEdge();
            }
        }
    //------
//  public void twoWayVertex(String n1 , String n2)
//  {
//      addEdge(n1, n2);
//      addEdge(n2, n1);
//  }
    //----------------

    public boolean isConnected(Vertex n1 , Vertex n2)
    {
        Set adjacentt = map.get(n1);
        if(adjacentt==null)
        {
            return false;
        }
        return adjacentt.contains(n2);
    }

    public LinkedList<Vertex> adjacentNodesList(Vertex last)
    {
        LinkedHashSet<Vertex> adjacentyy = map.get(last);
        if(adjacentyy==null)
        {
            return new LinkedList<>();
        }
        return new LinkedList<Vertex>(adjacentyy);
    }

}


    package GraphTEST;

import java.util.LinkedList;

public class TestGraph {



    static Vertex EN;
    static Vertex ST;
//starting and ending FROM --> TO
public static void main(String[] args) {

    Graph graph = new Graph();


        Vertex v0 = new Vertex("UK");
        Vertex v1 = new Vertex("USA");
        Vertex v2 = new Vertex("Dubai");
        Vertex v3 = new Vertex("Sri Lanka");
        Vertex v4 = new Vertex("Australia");
        Vertex v5 = new Vertex("Singapore");
        Vertex v6 = new Vertex("Malaysia");
        Vertex v7 = new Vertex("New Zeland");

//  graph.addEdge("UK", "USA");
//  graph.addEdge("USA", "UK");
//  graph.addEdge("UK", "Dubai");
//  graph.addEdge("Dubai", "UK");
//  graph.addEdge("Sri Lanka", "UK");
//  graph.addEdge("Sri Lanka", "USA");
//  graph.addEdge("Dubai", "Sri Lanka");
//  graph.addEdge("Sri Lanka", "Dubai");
//
//        graph.addEdge("Australia", "Dubai");
//        graph.addEdge("Sri Lanka", "Singapore");
//        graph.addEdge("Singapore ", "Sri Lanka");
//        graph.addEdge("Sri Lanka", "Malaysia");
//        graph.addEdge("Singapore", "Malaysia");
//        graph.addEdge("Singapore", "Australia");
//        graph.addEdge("New Zeland", "Singapore");
//        graph.addEdge("Malaysia", "New Zeland");
//        graph.addEdge("Australia", "New Zeland");
//        graph.addEdge("New Zeland", "Australia");


         ST = v3;
         EN = v0;



        //-----------------------------------------------
       graph.addEDGE(v0, v1, "NG",  35000);
       graph.addEDGE(v1, v0, "NG",  35000);

       graph.addEDGE(v2, v0, "EK",  26000);
       graph.addEDGE(v0, v2, "WK",  26000);

       graph.addEDGE(v3, v0, "UL",  46000);

       graph.addEDGE(v3, v1, "CX",  65000);

       graph.addEDGE(v2, v3, "FD",  20000);
       graph.addEDGE(v3, v2, "FD",  20000);

       graph.addEDGE(v4, v2, "QF",  150000);

       graph.addEDGE(v3, v5, "UL",  20000);
       graph.addEDGE(v5, v3, "UL",  20000);

       graph.addEDGE(v3, v6, "UL",  80000);

       graph.addEDGE(v5, v4, "QF",  110000);

       graph.addEDGE(v5, v6, "MH",  35000);

       graph.addEDGE(v4, v7, "NZ",  43000);
       graph.addEDGE(v7, v4, "NZ",  43000);

       graph.addEDGE(v7, v5, "NZ",  113000);

       graph.addEDGE(v6, v7, "MH",  73000);
       System.out.println("========================================================================");
       graph.printAll();
           System.out.println("========================================================================");
    LinkedList<Vertex> visited = new LinkedList<>();
    visited.add(ST);

    new TestGraph().breadthFirst(graph , visited);

}

public void breadthFirst(Graph graph, LinkedList<Vertex> visited )
{
    LinkedList<Vertex> links = graph.adjacentNodesList(visited.getLast());

    //CHECK
    for(Vertex Link : links)
    {

        if(visited.contains(Link))
        {
            //System.out.println(" I_N ");
            continue;
        }
        if(Link.equals(EN))
        {
                    System.out.println("****************");
            //System.out.println("IN THE IF");
            visited.add(Link);
                        System.out.println("--");
            printPath(visited);
                        System.out.println("888888888888888888888888");
            visited.removeLast();
            break;
        }
    }
    //in breadth-first recusrsion needs to come after visiting adjacent nodes

    //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    for (Vertex Link : links) {
        if (visited.contains(Link) || Link.equals(EN)) {
            continue;
        }
        visited.addLast(Link);
        breadthFirst(graph, visited );
        visited.removeLast();
    }
    //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}

public void printPath(LinkedList<Vertex> visited)
{

    for(Vertex Link : visited)
    {
        System.out.print(Link.name);
        System.out.print("  ");
    }
    System.out.println();
}

}


这是我的代码,它有四个类
1)边缘
2)顶点
3)图
4)测试图

在testGraph类中,存在用于“ BreadthfirstSearch”的方法,该方法将提出从一个地方到另一个地方的所有可能方法

我的任务是使该程序也花费每条路径的成本

如果有人可以帮助我做到这一点,我将不胜感激

最佳答案

这样的事情应该做到:

public void traverseBreadthFirst( Graph graph, Vertex startVertex,
    LinkedList<Vertex> visitedVertices )
{
    LinkedList<Vertex> adjacentVertices = graph.getAdjacentVertices( startVertex );
    for( Vertex visitedVertex : visitedVertices )
    {
        if( adjacentVertices.contains( visitedVertex ) )
            adjacentVertices.remove( visitedVertex );
    }
    for( Vertex adjacentVertex : adjacentVertices )
        visitedVertices.addLast( adjacentVertex );
    for( Vertex adjacentVertex : adjacentVertices )
        breadthFirst( graph, adjacentVertex, visitedVertices );
}

关于java - 如何进行广度优先搜索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28577301/

10-10 23:24