P3371 【模板】单源最短路径(弱化版)(Dijkstra 堆优化 JAVA)

洛谷原题
ArrayList模拟的vector第一维开足10000会T,所以只有70分

import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;

//用于存放to和cost,并且按路径升序
class Edge implements Comparable<Edge>{

	int to , cost;
	Edge(int to_,int cost_){
		to = to_;
		cost = cost_;
	}
	public int compareTo(Edge o) {
		return this.cost - o.cost;
	}
}

public class Main { 
	
    static int maxn=1000+10;
    static int[] l;
    static int dis[];  //存放最短距离值
    
    static ArrayList<ArrayList<Edge>> e;
	
	public static void dijkstra(int s) {
          int[] vis=new int[maxn];
          dis=new int[maxn];             //存放最短距离值
          for(int i=0;i<maxn;i++) {
        	  dis[i]=Integer.MAX_VALUE;  //全设为蓝点(未能到达的点)
          }
          Queue<Edge> que=new PriorityQueue<>();  //优先队列
          que.add(new Edge(s,0));                 //将起始点设为白点(可到达的点)
          dis[s]=0;                               
          while(que.isEmpty()==false) {
        	  Edge now=que.poll();                //取出该点并删除
        	  int u=now.to;                       //
        	  if(dis[u]<now.cost) continue;       //防止不按顺序
        	  if(vis[u]==1) continue;             //如果该点被用过
        	  vis[u]=1;                           //该点被用过
        	  
        	  for(int i=0;i<e.get(u).size();i++) {  //该点可以到多少个点
        		  int next=e.get(u).get(i).to;      //取第i组的to
        		  int cost=e.get(u).get(i).cost;    //取第i组的cost
        		  
        		  //如果to没走过   或者   to点的值大于当前点值加到to点的值 
        		  if(vis[next]==0 && dis[next]>dis[u]+cost) {
        			  dis[next]=dis[u]+cost;               //变值
        			  que.add(new Edge(next,dis[next]));   //队列加入next点
        		  }
        	  }
          }
	}
	
	public static void main(String[] args)  {
          Scanner in=new Scanner(System.in);
          e=new ArrayList<ArrayList<Edge>>();
          
          //开辟空间
          for(int i=0;i<maxn;i++) {
        	  ArrayList<Edge> temp=new ArrayList<Edge>();
        	  e.add(temp);
          }
          int n=in.nextInt();  //点的个数
          int m=in.nextInt();  //有向边的个数
          int s=in.nextInt();  //出发点的编号
          l=new int[maxn];
          
          for(int i=0;i<m;i++) {
        	  int from=in.nextInt();
        	  int to=in.nextInt();
        	  int cost=in.nextInt();
        	  e.get(from).add(new Edge(to,cost));  //from是外值,to和cost是属性值
          }
          dijkstra(s);
          
          //输出
          for(int i=1;i<=n;i++) {
              System.out.print(dis[i]+" ");
          }
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值