洛谷原题
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]+" ");
}
}
}