workspace/algorithm
[자바/플로이드워셜] 코드트리. 행렬로 주어진 간선
HwangJerry
2024. 2. 13. 07:56
문제
해석
어제 백준을 풀면서 플로이드워셜을 학습하고, 잊지 않기 위해 개념 문제를 하나 더 풀었다.
여기서는 플로이드워셜 로직을 활용하여 "직 간접적으로 각 정점끼리 연결되어 있는지 여부"를 검사하는 로직을 구성하게끔 유도한다.
단순한 문제였으므로 코드로 대신한다.
코드
package 알고리즘연습.codetree.그래프.플로이드워셜;
import java.io.*;
import java.util.StringTokenizer;
public class CodeTree_행렬로주어진간선 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int[][] adj = new int[n+1][n+1];
for (int i = 1; i <= n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 1; j <= n; j++) {
adj[i][j] = Integer.parseInt(st.nextToken());
}
}
String ans = solution(n, adj);
bw.write(ans);
br.close();
bw.flush();
bw.close();
}
private static String solution(int n, int[][] adj) {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (adj[i][k] + adj[k][j] >= 2) { // 간선을 타고 타고 연결된 정점도 "연결"로 표기
adj[i][j] = 1;
}
}
}
}
StringBuffer sb = new StringBuffer();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (adj[i][j] >= 1 || i == j) {
sb.append("1 ");
continue;
}
sb.append("0 ");
}
sb.append("\n");
}
return sb.toString();
}
}