利用邻接表求解所有节点的最短路径 java实现 可运行

一:节点的定义

package tiger.yyh.practice;


import java.util.ArrayList;
import java.util.List;

class Node {  
    public int name;  
    public  List<Node> adjs = new ArrayList<Node>();  
      
Node(int name) {  
   this.name = name;  
}  
      
   public void addArc(Node node) {  
        adjs.add(node);  
    }


public int getName() {
return name;
}


public void setName(int name) {
this.name = name;
}  

二:邻接表的定义

package tiger.yyh.practice;


import java.util.ArrayList;
import java.util.List;


public class AGraph {  
    
   public static List<Node> vertexes = new ArrayList<Node>();  
      
   public void addVertex(Node vertex) {  
        vertexes.add(vertex);
    }  
      
    public void addArc(Node head, Node tail) {  
        head.addArc(tail);  
    }  
   
}  

三:静态变量的定义

package tiger.yyh.practice;

public class StaticVariable {
public final static String filePathRead =  "";
public final static String filePathWrite = "";
public final static String filePathNode ="" ;
public final static int MAXNODE = ;
public final static int MAXSTACK = ;
}

四:广度优先遍历实现无权无向图的最短路径

package tiger.yyh.practice;


import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;




public class BFSAGraph {
// public  Map<Integer,Integer> dist;

// public BFSAGraph() {
// dist = getValue(StaticVariable.filePathNode);
// }
public Map<Integer, Integer> getValue(String filePathNode) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
List<String> list = CreateAGraph.readTxtFile(filePathNode);
for (String str : list) {
map.put(Integer.valueOf(str.trim()), 0);
}
return map;
}

public Map<Integer, Integer> bfs(AGraph aGraph,int v,List<Node> list) throws IOException{
Map<Integer,Integer> visited = getValue(StaticVariable.filePathNode);
Map<Integer,Integer> dist = getValue(StaticVariable.filePathNode);
int[] que = new int[StaticVariable.MAXSTACK];
int front=0,rear=0;
int node;
Node head = null;
visited.put(v,1) ;
rear = (rear+1)%StaticVariable.MAXSTACK;
que[rear] = v;

while(front != rear){
front = (front+1)%StaticVariable.MAXSTACK;
node = que[front];
System.out.println("node = "+ node);
for(int i=0; i<list.size(); ++i){
            if(list.get(i).name == node){
            head = list.get(i);
            break;
            }
            }
if(head.adjs.size() != 0){
for(Node arc:head.adjs){
if(visited.get(arc.getName())==0){
rear = (rear+1)%StaticVariable.MAXSTACK;
que[rear] = arc.getName();
visited.put(arc.getName(), 1);
dist.put(arc.getName(), dist.get(head.getName())+1);
}
}
}
}
for(Integer key:dist.keySet()){
if(dist.get(key)!=0){
System.out.println("v = " +v+" key = "+key+" value =  "+dist.get(key));
}
}
return dist;
}
}


五:构建邻接表

package tiger.yyh.practice;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class CreateAGraph {

public static  List<String> list;
public AGraph aGraph;
public List<Node> nodelist;
public List<String> ls;


    public static List<String> readTxtFile(String filePath){
        try {
                String encoding="GBK";
                File file=new File(filePath);
                if(file.isFile() && file.exists()){                               //判断文件是否存在
                    InputStreamReader read = new InputStreamReader(
                    new FileInputStream(file),encoding);                       //考虑到编码格式
                    BufferedReader bufferedReader = new BufferedReader(read);
                    String lineTxt = null;
                    list= new ArrayList<String>();
                    while((lineTxt = bufferedReader.readLine()) != null){
                    list.add(lineTxt);
                    }
                    read.close();     
       }else{
           System.out.println("找不到指定的文件");
       }
       } catch (Exception e) {
           System.out.println("读取文件内容出错");
           e.printStackTrace();
       }
return list;
    }

    public List<Node> getNode(String filePathNode){
    AGraph aGraph = new AGraph(); 
    List<String> list = readTxtFile(filePathNode);
    for(String str:list){
    Node  node = new Node(Integer.valueOf(str.trim()));
    aGraph.addVertex(node);
    }
    return aGraph.vertexes;
    }
    
   
    
    public  AGraph createAGraph(String filePathRead,String filePathNode){
    nodelist = getNode(filePathNode);
    aGraph = new AGraph();
    Node head = null;
    Node tail = null;
    ls = readTxtFile(filePathRead);
   
    for(String l:ls){
    String[] lineArray=l.split(",",2);   //使用limit,最多分割成2个字符串 
            int i = Integer.valueOf(lineArray[0].trim());
            int j = Integer.valueOf(lineArray[1].trim());
            for(int k=0; k<nodelist.size();++k){
            if(nodelist.get(k).name == i){
            head = nodelist.get(k);
            break;
            }
            }
            for(int m=0; m<nodelist.size(); ++m){
            if(nodelist.get(m).name == j){
            tail = nodelist.get(m);
            break;
            }
            }
            aGraph.addArc(head, tail);
            aGraph.addArc(tail, head);    //加上他就是无向图,删去他就是有向图
    }
    return aGraph;
    }
    
    public void print(List<Node> list) throws IOException {  
    BufferedWriter bw = new BufferedWriter(new FileWriter(new File(StaticVariable.filePathWrite)));
        for(Node head : list) {  
        if(head.adjs.size()!=0){
        bw.write(String.valueOf(head.getName()));
           System.out.print(head.getName());  
           for(Node arc : head.adjs) {
            bw.write(" -> ");
            bw.write(String.valueOf(arc.getName()));
               System.out.print(" -> ");  
               System.out.print(arc.getName());  
           }  
           bw.newLine();
           System.out.println();  
        }
        }
        bw.close();
    }
    
    
    public static void  main(String[] args) throws IOException {
    CreateAGraph cAGraph = new CreateAGraph();
    AGraph aGraph = cAGraph.createAGraph(StaticVariable.filePathRead, StaticVariable.filePathNode);
    cAGraph.print(aGraph.vertexes);
    }
}

六:main程序

package tiger.yyh.practice;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.Map;


public class ShestPath {
public static void main(String[] args) throws IOException{
CreateAGraph cAGraph = new CreateAGraph();
    AGraph aGraph = cAGraph.createAGraph(StaticVariable.filePathRead, StaticVariable.filePathNode);
    BufferedWriter bw = new BufferedWriter(new FileWriter(new File(StaticVariable.filePathWrite)));;
BFSAGraph bfsaGraph = new BFSAGraph();
List<String> list = CreateAGraph.readTxtFile(StaticVariable.filePathNode);

    for(String  str:list){
Map<Integer, Integer> dist = bfsaGraph.bfs(aGraph,Integer.valueOf(str),aGraph.vertexes);
for(Integer key:dist.keySet()){
if(dist.get(key)!=0){
bw.write(Integer.valueOf(str)+"\t"+key+"\t"+dist.get(key));
System.out.println("v = " +Integer.valueOf(str)+" key = "+key+" value =  "+dist.get(key));
bw.newLine();
}
}
}
    bw.close();
}
}


注释:只需更改静态变量的那个类,本程序即可使用,










### 回答1: 在Java中,可以使用Dijkstra算法来计算经过指定的中间节点集的最短路径。 Dijkstra算法是一种贪婪算法,用于计算中指定节点到其他节点最短路径。其基本思想是从起始节点开始,逐步迭代计算这个节点到其他节点的最短距离,直到遍历完所有节点。 要实现经过指定的中间节点集的最短路径算法,可以对Dijkstra算法进行修改。首先,需要将起始节点到中间节点集的最短距离初始化为0,而不是无穷大。然后,使用Dijkstra算法计算起始节点到所有中间节点的最短距离。 接下来,将中间节点集中的节点分别作为起始节点,再次运行Dijkstra算法,计算这些节点到其他节点的最短距离。重复这个过程,直到所有中间节点集中的节点都作为起始节点运行了一次Dijkstra算法。 最后,根据这些运行结果,可以得到经过指定的中间节点集的最短路径。可以选取起始节点到中间节点集的最短距离加上中间节点到目标节点的最短距离最小的路径作为最短路径。 在Java中,可以使用邻接矩阵或邻接表表示,并利用优先队列来实现Dijkstra算法。通过编写相应的代码,可以实现最短路径算法。 ### 回答2: 中间节点最短路径算法是在中通过指定的中间节点集合,求解起点到终点的最短路径的一种算法。在Java中可以使用Dijkstra算法或Floyd-Warshall算法来实现。 Dijkstra算法适用于单源最短路径问题,即从一个顶点到其他所有顶点的最短路径。该算法通过维护一个距离表来记录起点到各个顶点的距离,并在每一步中选择最短路径来更新距离表。当所有顶点都被遍历后,就得到了起点到终点的最短路径。 在Dijkstra算法的基础上,可以对中间节点集进行限制,只计算经过指定节点集合的最短路径。可以通过在距离表中设置一个标志位来表示节点是否属于中间节点集,然后在每一步中只选择距离表中标志位为true的节点来更新距离表,从而得到指定中间节点集的最短路径。 另一种算法是Floyd-Warshall算法,该算法适用于全源最短路径问题,即计算任意两个顶点之间的最短路径。算法通过维护一个距离矩阵来记录任意两个顶点之间的距离,并在每一步中选择经过指定中间节点集的路径来更新距离矩阵。最终得到的距离矩阵即包含了经过指定中间节点集的最短路径信息。 在Java中,可以使用邻接矩阵或邻接表来表示的结构,然后通过编写相应的Dijkstra算法或Floyd-Warshall算法的实现求解经过指定中间节点集的最短路径问题。这些算法的时间复杂度都为O(V^3),其中V表示顶点的个数。 ### 回答3: 中间节点集的最短路径算法是一种用于寻找两个节点之间的最短路径的算法。在Java中,可以使用迪杰斯特拉算法来实现这一目标。 迪杰斯特拉算法利用了动态规划的思想。它通过维护一个距离数组来记录每个节点到起始节点的最短距离,并逐步更新距离数组中的值,直到找到最短路径为止。中间节点集用于限制最短路径的范围。 首先,需要创建一个距离数组dist[],用于存放每个节点到起始节点的最短距离。将起始节点的距离设置为0,其他节点的距离设置为无穷大。同时,创建一个集合visited[],用于标记已经找到最短路径节点。 然后,将起始节点添加到visited[]中,并遍历起始节点的所有邻居节点。对于每个邻居节点,计算通过起始节点到该邻居节点的距离,比较距离数组dist[]中的值,如果新的距离较短,则更新距离数组dist[]中的值。 接下来,从距离数组dist[]中选择未访问的节点中距离最短的节点。将该节点添加到visited[]中,并更新该节点的所有邻居节点的距离数组dist[]的值。 重复以上步骤,直到找到终点节点或者所有节点都被添加到visited[]中。 最后,根据距离数组dist[]中的值,可以得到起始节点到终点节点最短路径。 总结而言,Java版经过指定的中间节点集的最短路径算法可以使用迪杰斯特拉算法来实现。这个算法利用动态规划的思想,通过维护一个距离数组来记录每个节点到起始节点的最短距离。中间节点集用于限制最短路径的范围。实现以上算法,可以找到起始节点到终点节点最短路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值