zoukankan      html  css  js  c++  java
  • Java数据结构——带权图

    带权图的最小生成树——Prim算法和Kruskal算法

    带权图的最短路径算法——Dijkstra算法

    package graph;
    // path.java
    // demonstrates shortest path with weighted, directed graphs 带权图的最短路径算法
    // to run this program: C>java PathApp
    ////////////////////////////////////////////////////////////////
    class DistPar             // distance and parent
       {                      // items stored in sPath array
       public int distance;   // distance from start to this vertex
       public int parentVert; // current parent of this vertex
    // -------------------------------------------------------------
       public DistPar(int pv, int d)  // constructor
          {
          distance = d;
          parentVert = pv;
          }
    // -------------------------------------------------------------
       }  // end class DistPar
    ///////////////////////////////////////////////////////////////
    class Vertex
       {
       public char label;        // label (e.g. 'A')
       public boolean isInTree;
    // -------------------------------------------------------------
       public Vertex(char lab)   // constructor
          {
          label = lab;
          isInTree = false;
          }
    // -------------------------------------------------------------
       }  // end class Vertex
    ////////////////////////////////////////////////////////////////
    class Graph
       {
       private final int MAX_VERTS = 20;
       private final int INFINITY = 1000000;
       private Vertex vertexList[]; // list of vertices
       private int adjMat[][];      // adjacency matrix
       private int nVerts;          // current number of vertices
       private int nTree;           // number of verts in tree
       private DistPar sPath[];     // array for shortest-path data
       private int currentVert;     // current vertex
       private int startToCurrent;  // distance to currentVert
    // -------------------------------------------------------------
       public Graph()               // constructor
          {
          vertexList = new Vertex[MAX_VERTS];
                                             // adjacency matrix
          adjMat = new int[MAX_VERTS][MAX_VERTS];
          nVerts = 0;
          nTree = 0;
          for(int j=0; j<MAX_VERTS; j++)     // set adjacency
             for(int k=0; k<MAX_VERTS; k++)  //     matrix
                adjMat[j][k] = INFINITY;     //     to infinity
          sPath = new DistPar[MAX_VERTS];    // shortest paths
          }  // end constructor
    // -------------------------------------------------------------
       public void addVertex(char lab)
          {
          vertexList[nVerts++] = new Vertex(lab);
          }
    // -------------------------------------------------------------
       public void addEdge(int start, int end, int weight)
          {
          adjMat[start][end] = weight;  // (directed)
          }
    // -------------------------------------------------------------
       public void path()                // find all shortest paths
          {
          int startTree = 0;             // start at vertex 0
          vertexList[startTree].isInTree = true;
          nTree = 1;                     // put it in tree
    
          // transfer row of distances from adjMat to sPath
          for(int j=0; j<nVerts; j++)
             {
             int tempDist = adjMat[startTree][j];
             sPath[j] = new DistPar(startTree, tempDist);
             }
    
          // until all vertices are in the tree
          while(nTree < nVerts)
             {
             int indexMin = getMin();    // get minimum from sPath
             int minDist = sPath[indexMin].distance;
    
             if(minDist == INFINITY)     // if all infinite
                {                        // or in tree,
                System.out.println("There are unreachable vertices");
                break;                   // sPath is complete
                }
             else
                {                        // reset currentVert
                currentVert = indexMin;  // to closest vert
                startToCurrent = sPath[indexMin].distance;
                // minimum distance from startTree is
                // to currentVert, and is startToCurrent
                }
             // put current vertex in tree
             vertexList[currentVert].isInTree = true;
             nTree++;
             adjust_sPath();             // update sPath[] array
             }  // end while(nTree<nVerts)
    
          displayPaths();                // display sPath[] contents
    
          nTree = 0;                     // clear tree
          for(int j=0; j<nVerts; j++)
             vertexList[j].isInTree = false;
          }  // end path()
    // -------------------------------------------------------------
       public int getMin()               // get entry from sPath
          {                              //    with minimum distance
          int minDist = INFINITY;        // assume minimum
          int indexMin = 0;
          for(int j=1; j<nVerts; j++)    // for each vertex,
             {                           // if it's in tree and
             if( !vertexList[j].isInTree &&  // smaller than old one
                                   sPath[j].distance < minDist )
                {
                minDist = sPath[j].distance;
                indexMin = j;            // update minimum
                }
             }  // end for
          return indexMin;               // return index of minimum
          }  // end getMin()
    // -------------------------------------------------------------
       public void adjust_sPath()
          {
          // adjust values in shortest-path array sPath
          int column = 1;                // skip starting vertex
          while(column < nVerts)         // go across columns
             {
             // if this column's vertex already in tree, skip it
             if( vertexList[column].isInTree )
                {
                column++;
                continue;
                }
             // calculate distance for one sPath entry
                           // get edge from currentVert to column
             int currentToFringe = adjMat[currentVert][column];
                           // add distance from start
             int startToFringe = startToCurrent + currentToFringe;
                           // get distance of current sPath entry
             int sPathDist = sPath[column].distance;
    
             // compare distance from start with sPath entry
             if(startToFringe < sPathDist)   // if shorter,
                {                            // update sPath
                sPath[column].parentVert = currentVert;
                sPath[column].distance = startToFringe;
                }
             column++;
             }  // end while(column < nVerts)
       }  // end adjust_sPath()
    // -------------------------------------------------------------
       public void displayPaths()
          {
          for(int j=0; j<nVerts; j++) // display contents of sPath[]
             {
             System.out.print(vertexList[j].label + "="); // B=
             if(sPath[j].distance == INFINITY)
                System.out.print("inf");                  // inf
             else
                System.out.print(sPath[j].distance);      // 50
             char parent = vertexList[ sPath[j].parentVert ].label;
             System.out.print("(" + parent + ") ");       // (A)
             }
          System.out.println("");
          }
    // -------------------------------------------------------------
       }  // end class Graph
    ////////////////////////////////////////////////////////////////
    class path
       {
       public static void main(String[] args)
          {
          Graph theGraph = new Graph();
          theGraph.addVertex('A');     // 0  (start)
          theGraph.addVertex('B');     // 1
          theGraph.addVertex('C');     // 2
          theGraph.addVertex('D');     // 3
          theGraph.addVertex('E');     // 4
    
          theGraph.addEdge(0, 1, 50);  // AB 50
          theGraph.addEdge(0, 3, 80);  // AD 80
          theGraph.addEdge(1, 2, 60);  // BC 60
          theGraph.addEdge(1, 3, 90);  // BD 90
          theGraph.addEdge(2, 4, 40);  // CE 40
          theGraph.addEdge(3, 2, 20);  // DC 20
          theGraph.addEdge(3, 4, 70);  // DE 70
          theGraph.addEdge(4, 1, 50);  // EB 50
    
          System.out.println("Shortest paths");
          theGraph.path();             // shortest paths
          System.out.println();
          }  // end main()
       }  // end class PathApp
    ////////////////////////////////////////////////////////////////
    
  • 相关阅读:
    txt换行追加写入
    np.unique( )的用法
    生成自己想要的任意颜色的图片
    183. 木材加工
    575. 字符串解码
    364. 接雨水 II
    255. Multi-string search
    433. 岛屿的个数
    591. 连接图 III
    918. 三数之和
  • 原文地址:https://www.cnblogs.com/tonglin0325/p/5958527.html
Copyright © 2011-2022 走看看