가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄부터 N개 줄에는 그래프의 인접 행렬이 주어진다. i번째 줄의 j번째 숫자가 1인 경우에는 i에서 j로 가는 간선이 존재한다는 뜻이고, 0인 경우는 없다는 뜻이다. i번째 줄의 i번째 숫자는 항상 0이다.
출력
총 N개의 줄에 걸쳐서 문제의 정답을 인접행렬 형식으로 출력한다. 정점 i에서 j로 가는 경로가 있으면 i번째 줄의 j번째 숫자를 1로, 없으면 0으로 출력해야 한다.
예제 입력 1
3 0 1 0 0 0 1 1 0 0 |
예제 출력 1
1 1 1 1 1 1 1 1 1 |
예제 입력 2
7 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 |
예제 출력 2
1 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 |
더보기
Solution
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int N, **G=NULL;
scanf("%d", &N);
G=(int **)malloc(N*sizeof(int *));
for(int n=0;n<N;n++)
G[n]=(int *)malloc(N*sizeof(int));
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
scanf("%d", &G[i][j]);
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
if(G[i][j])
for(int k=0;k<N;k++)
if(G[k][i])
G[k][j]=1;
if(G[j][i])
for(int k=0;k<N;k++)
if(G[k][j])
G[k][i]=1;
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
printf("%d ", G[i][j]);
printf("\n");
free(G[i]);
}
free(G);
return 0;
}
728x90
'백준 알고리즘' 카테고리의 다른 글
<백준 알고리즘> 14888번: 연산자 끼워넣기 (0) | 2023.01.27 |
---|---|
<백준 알고리즘> 14889번: 스타트와 링크 (0) | 2023.01.27 |
<백준 알고리즘> 15686번: 치킨 배달 (0) | 2023.01.25 |
<백준 알고리즘> 5525번: IOIOI (0) | 2023.01.22 |
<백준 알고리즘> 1107번: 리모컨 (1) | 2023.01.22 |