Dijkstra java code

package pass;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

class Edgex {
	int from;
	int to;
	int weight;

	public Edgex(int from, int to, int weight) {
		this.from = from;
		this.to = to;
		this.weight = weight;
	}
}
 class comppq implements Comparator<Edgex>{
	@Override
	public int compare(Edgex o1, Edgex o2) {
		return o2.weight-o1.weight;
	}
}
public class Dijkstra {
	/*
7 9
0 1 6
1 2 5
0 3 2
3 1 7
3 4 5
4 5 5
4 6 1
1 5 3
5 2 3	 
	 */
  
     
 	 static int vs,lines;
	 static LinkedList<Edgex> Edges = new LinkedList<Edgex>();
	 static LinkedList<Integer> Visited = new LinkedList<Integer>();
	 static LinkedList<Integer> VetexsMark = new LinkedList<Integer>();
	public static void main(String[] args) throws IOException {
		
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine());
		vs=Integer.parseInt(st.nextToken());
		lines=Integer.parseInt(st.nextToken());
		
		 for(int l=0;l<lines;l++){
			st=new StringTokenizer(br.readLine());
			int	from=Integer.parseInt(st.nextToken());
			int to=Integer.parseInt(st.nextToken());
			int weight=Integer.parseInt(st.nextToken());
			Edgex e=new Edgex(from,to,weight);
			Edges.add(e);	
	     }
		
       for(int i=0;i<vs;i++){
    	   VetexsMark.add(Integer.MAX_VALUE/2);
       }
		runDijkstra(6);
	}
	public static void runDijkstra(int target){
		int start=0;
		PriorityQueue<Edgex> pq=new PriorityQueue<Edgex>(new comppq());
		pq.add(new Edgex(0,0,0));
		VetexsMark.set(0, 0);
		Visited.add(start);
		while(!pq.isEmpty()){
			
			int current=pq.poll().to;
			if(current==target) break;
			LinkedList<Edgex> edgexlist=getTargets(current);
			
			for(int i=0;i<edgexlist.size();i++)
			{
				Edgex cusr=edgexlist.get(i);
				if(VetexsMark.get(current)+cusr.weight<VetexsMark.get(cusr.to)){
					VetexsMark.set(cusr.to,VetexsMark.get(current)+cusr.weight);
					Visited.add(cusr.to);
					pq.add(cusr);
				}
			}
			
		}
		for(int k=0;k<VetexsMark.size();k++){
			 System.out.println("0 --> "+k+"    "+VetexsMark.get(k));
		}
		
	}
		
	public static LinkedList<Edgex> getTargets(int x){
		LinkedList<Edgex> edgexlist=new LinkedList<>();
		for(int i=0;i<Edges.size();i++){
			if(Edges.get(i).from==x){
				edgexlist.add(Edges.get(i));
			}
		}
		return edgexlist;
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值