https://www.acmicpc.net/problem/11403
문제
가중치 없는 방향 그래프 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으로 출력해야 한다.
풀이
플로이드-와샬의 냄새가 났다. 혹시나 하고 분류를 보니 플로이드-와샬 문제였다. 괜히 기분이 좋았다 ㅋㅋ
플로이드-와샬은 모든 정점끼리의 최단거리를 구하는 알고리즘인데 모든 정점의 최단거리를 구한다는 것은 연결의 유무도 판단 할 수 있다는 의미다. 알고리즘을 돌면서 연결의 유무만 판단해주면 된다.
코드
#include <string>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <climits>
#include <set>
#define p(a, b) make_pair(a, b)
#define SWAP(a, b, type) do { \
type temp; \
temp = a; \
a = b; \
b = temp; \
} while (0)
#define INF 1000000000
#define endl '\n'
#define ll long long
using namespace std;
int N;
int info[100][100];
void input() {
cin>>N;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
cin>>info[i][j];
}
}
}
void init() {
}
void solution() {
//플로이드-와샬
for(int k=0;k<N;k++){
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(!info[i][j]){
info[i][k]==1&&info[k][j]==1?info[i][j]=1:info[i][j]=0;
}
}
}
}
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
cout<<info[i][j]<<' ';
}
cout<<endl;
}
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
input();
solution();
return 0;
}
'백준 > Graph' 카테고리의 다른 글
[BOJ] 11779 최소비용 구하기 2 (0) | 2022.03.22 |
---|---|
[BOJ] 7569 토마토 (0) | 2022.03.10 |
[BOJ] 24461 그래프의 줄기 (0) | 2022.02.17 |
[BOJ] 2056 작업 (0) | 2022.02.17 |
[BOJ] 1043 거짓말 (0) | 2022.02.14 |