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();
    }
}