zoukankan      html  css  js  c++  java
  • Dijkstra算法

    点对象

    public class Vertex  implements Comparable<Vertex>{//必须实现此接口才能入栈
    	private String name;//点的名字
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getPath() {
    		return path;
    	}
    
    	public void setPath(int path) {
    		this.path = path;
    	}
    
    	public boolean isMarked() {
    		return isMarked;
    	}
    
    	public void setMarked(boolean isMarked) {
    		this.isMarked = isMarked;
    	}
    
    	public String getLast() {
    		return last;
    	}
    
    	public void setLast(String last) {
    		this.last = last;
    	}
    
    	private int path;//到该点的最短距离
    	private boolean isMarked;//是否被标记
    	private String last;//到该点的上一个点
    	
    	
    	public Vertex(String name){
    		this.name=name;
    		this.path=Integer.MAX_VALUE;
    		isMarked=false;
    		this.last=null;		
    	}
    	
    	 @Override
    	    public int compareTo(Vertex o) {
    	        return o.path > path?-1:1;
    	    }
    	
    	
    
    }
    

    算法核心

    import java.util.ArrayList;
    import java.util.List;
    import java.util.PriorityQueue;
    import java.util.Queue;
    
    public class Grap {
    	
    	private List<Vertex> vertexs;//所有的点
    	private Queue<Vertex> queue;//没有访问过的点
    	private int[][] edgs;//邻接矩阵
    	
    	public Grap(List<Vertex> v,int[][] edgs) {
    		this.vertexs=v;
    		this.edgs=edgs;
    		initQueue();
    	}
    	
    	//初始化队列
    	public void initQueue(){
    		queue=new PriorityQueue<>();
    		for(Vertex v:vertexs){
    			queue.add(v);
    		}
    	}
    	
    	
    	//djkstra算法
    	public void dijkstra(){
    		while(!queue.isEmpty()){//当所有的都为true时结束
    			Vertex v=queue.element();
    			v.setMarked(true);
    			//得到当前节点的邻接点
    			List<Vertex> neighbors=getNeighbors(v);
    			//更新邻接点
    			updateNeighbors(v, neighbors);
    			//该节点出队列
    			queue.poll();
    			
    		}
    		
    	}
    	
    	//得到一个点的邻接点
    	public List<Vertex> getNeighbors(Vertex v){
    		List<Vertex> neighbors=new ArrayList<Vertex>();
    		int position=vertexs.indexOf(v);
    		for(Vertex neighbor:vertexs){
    			int i=vertexs.indexOf(neighbor);
    			if(i==position){
    				continue;
    			}
    			
    			if(edgs[position][i]!=Integer.MAX_VALUE&&neighbor.isMarked()){
    				neighbors.add(neighbor);
    			}
    			
    		}
    		
    		return neighbors;
    		
    	}
    	
    	//更新邻接点的值
    	public void updateNeighbors(Vertex v,List<Vertex> neighbors){
    		int position=vertexs.indexOf(v);
    		for(Vertex neighbor:neighbors){
    			int i=vertexs.indexOf(neighbor);
    			int path=v.getPath()+edgs[position][i];
    			if(path<neighbor.getPath()){
    				vertexs.get(i).setPath(path);
    				vertexs.get(i).setLast(v.getName());
    			}			
    		}
    	}
    	
    	//输出
    	public void  printPath(Vertex v) {		
    		if(v.getLast()!=null){
    			Vertex last;
    			for(Vertex temp:vertexs){
    				if(temp.getName()==v.getLast()){
    					last=temp;
    					printPath(last);
    					System.out.print(" to ");
    				}
    			}
    		}
    		System.out.print(v.getName());
    		
    	}
    
    
    }
    

    测试

    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
    
    	public static void main(String[] args) {
    		 List<Vertex> vertexs = new ArrayList<Vertex>();
    	        Vertex a = new Vertex("v1");
    	        a.setPath(0);
    	        Vertex b = new Vertex("v2");
    	        Vertex c = new Vertex("v3");
    	        Vertex d = new Vertex("v4");
    	        Vertex e = new Vertex("v5");
    	        Vertex f = new Vertex("v6");
    	        Vertex g =new Vertex("v7");
    	        vertexs.add(a);
    	        vertexs.add(b);
    	        vertexs.add(c);
    	        vertexs.add(d);
    	        vertexs.add(e);
    	        vertexs.add(f);
    	        vertexs.add(g);
    	        int[][] edges=new int[7][7];
    	        for(int i=0;i<7;i++){
    	        	for(int j=0;j<7;j++){
    	        		edges[i][j]=Integer.MAX_VALUE;
    	        	}
    	        }
    	        
    	        edges[0][1]=2;
    	        edges[0][3]=1;
    	        edges[1][3]=3;
    	        edges[1][4]=10;
    	        edges[2][0]=4;
    	        edges[2][5]=5;
    	        edges[3][2]=2;
    	        edges[3][4]=2;
    	        edges[3][5]=8;
    	        edges[3][6]=4;
    	        edges[4][6]=6;
    	        edges[6][5]=1;
    	        Grap graph = new Grap(vertexs, edges);
    	        graph.dijkstra();
    	        System.out.print("v1 to ");
    	        graph.printPath(g);
    	       
    	      
    
    	}
    
    }
  • 相关阅读:
    gulp安装
    ssh公钥自动登陆
    Laravel 依赖注入原理
    mac添加环境变量
    get和post的区别
    CPU进程与线程的关系和区别
    微信支付开发+{ping++}微信支付托管
    git学习笔记
    消除 activity 启动时白屏、黑屏问题
    转:android中APK开机自动运行
  • 原文地址:https://www.cnblogs.com/c-lover/p/10038754.html
Copyright © 2011-2022 走看看