https://www.acmicpc.net/problem/11403
/**
* 11403_경로 찾기
*
* 플로이드-워셜 알고리즘을 사용한다.
* N이 100이하이므로 100 * 100 * 100을 해도 1억 미만이므로 사용 가능
* k는 중간지점
* i->k, k->j가 모두 1이면 i->j 또한 갈 수 있으므로 1로 값을 저장한다.
*/
public class P_11403 {
static int N;
static int[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
map = new int[N][N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int k = 0; k < N; k++) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][k] == 1 && map[k][j] == 1) {
map[i][j] = 1;
}
}
}
}
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println("");
}
}
}