아이디어
어려운점 & 실수
정답
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.util.Arrays;
importjava.util.LinkedList;
importjava.util.List;
importjava.util.StringTokenizer;
publicclassN11780 {
publicstaticvoidmain(String[] args) throwsIOException {
BufferedReaderbr = newBufferedReader(newInputStreamReader(System.in));
StringTokenizertoken;
intvertext = Integer.parseInt(br.readLine());
intedge = Integer.parseInt(br.readLine());
int[][] D = newint[vertext + 1][vertext + 1];
int[][] nxt = newint[vertext + 1][vertext + 1];
intINF = 100_000_001;
// 최단거리 배열 초기화for (inti = 0; i < D.length; i++) {
Arrays.fill(D[i], INF);
D[i][i] = 0; //자기 자신으로 가는 경로는 0
}
// 간선 1개로 건널 수 있는 곳 초기화 "중간에 다른 정점을 거치지 않았을 때 최단 거리"for (inti = 0; i < edge; i++) {
token = newStringTokenizer(br.readLine());
intfrom = Integer.parseInt(token.nextToken());
intto = Integer.parseInt(token.nextToken());
intcost = Integer.parseInt(token.nextToken());
D[from][to] = Math.min(D[from][to], cost);
nxt[from][to] = to;
}
//floyd 알고리즘for (intmid = 0; mid <= vertext; mid++) {
for (intstart = 1; start <= vertext; start++) { //start -> midfor (intend = 1; end <= vertext; end++) { // mid -> endintcost = D[start][mid] + D[mid][end];
if (cost < D[start][end]) {
D[start][end] = cost;
nxt[start][end] = nxt[start][mid];
}
}
}
}
StringBuildersb = newStringBuilder();
for (intstart = 1; start <= vertext; start++) {
for (intend = 1; end <= vertext; end++) {
if (D[start][end] == INF) {
sb.append("0").append(" ");
} else {
sb.append(D[start][end]).append(" ");
}
}
sb.append("\n");
}
for (intstart = 1; start <= vertext; start++) {
for (intend = 1; end <= vertext; end++) {
if (D[start][end] == 0 || D[start][end] == INF) {//자기자신이거나 길이 없는 경우sb.append("0").append("\n");
continue;
}
sb.append(getCourse(nxt, start, end)).append("\n");
}
}
System.out.println(sb.toString());
}
privatestaticStringgetCourse(finalint[][] nxt, intstart, intend) {
// start -> end 로 가는 최단 경로를 계산List<Integer> path = newLinkedList<>();
intcur = start;
while (cur != end) {
path.add(cur);
cur = nxt[cur][end];
}
path.add(end);
// path를 문자열로 만들어서 반환StringBuildersb = newStringBuilder();
sb.append(path.size()).append(" ");
for (Integerp : path) {
sb.append(p).append(" ");
}
returnsb.toString();
}
}
아이디어
어려운점 & 실수
정답