import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; public class Main { static class Node{ public Node(int v,int w) { this.v=v; this.w=w; } int v; int w; } static class R{ public R(int vertex) { this.vertex=vertex; this.distance=Integer.MAX_VALUE; } int vertex; int distance; int number; int people; } static Comparator<R> com=new Comparator<R>() { @Override public int compare(R o1, R o2) { return o1.distance-o2.distance; } }; static Scanner scn=new Scanner(System.in); static int vertex=scn.nextInt(),start=scn.nextInt(); static List<List<Node>> G=new ArrayList<>(); static boolean[] visit=new boolean[vertex]; static R[] form=new R[vertex]; static Queue<R> pri=new PriorityQueue<>(com); public static void main(String[] args) { // 初始化 for(int i=0;i<vertex;i++) { G.add(new ArrayList<>()); form[i]=new R(i); } // 创建图 for(int i=0;i<vertex;i++) { for(int j=0;j<vertex;j++) { int w=scn.nextInt(); G.get(i).add(new Node(j, w)); } } dijstra(start); for(int i=0;i<vertex;i++) { if(i!=start) { if(form[i].distance!=Integer.MAX_VALUE) { System.out.print(form[i].distance+" "); }else { System.out.print("-1 "); } } } System.out.println(); } static void dijstra(int start) { form[start].distance=0; pri.offer(form[start]); for(int i=0;i<vertex;i++) { int u=pri.poll().vertex; visit[u]=true; for(int j=0;j<G.get(u).size();j++) { int v=G.get(u).get(j).v; int w=G.get(u).get(j).w; if(G.get(u).get(j).w!=0 &&!visit[v] && form[u].distance+w<form[v].distance) { form[v].distance=form[u].distance+w; form[v].number=form[u].number; pri.offer(form[v]); } } } } } /************************************************************** Problem: 2165 User: admin Language: Java Result: Accepted Time:955 ms Memory:46632 kb ****************************************************************/