https://www.acmicpc.net/problem/15723
15723번: n단 논법
m개의 줄에 걸쳐 각 줄에 결론이 참인지 거짓인지 출력하라. 참일 경우 T, 거짓일 경우 F를 출력하라. 알 수 없는 경우도 거짓이다. 답은 필히 대문자로 출력해야 한다.
www.acmicpc.net
플로이드 와샬로 접근하여 푼 문제이다. fr과 to사이를 그래프로 정의하여 특정 정점을 거쳐서 to에 도달할 수 있다면 T를 출력하고 그렇지 않으면 F를 출력하였다.
#include <iostream>
#include <vector>
#include <string>
#include <climits>
using namespace std;
int m, n;
int d[26][26];
string s;
char fr, to;
//플로이드 와샬로 정의, k번째 정점을 거쳐 가면 가고자 하는 점에 도착할 수 있는지 판별
void floydWashall() {
for (int k = 0; k < 26; k++) {
for (int i = 0; i < 26; i++) {
for (int j = 0; j < 26; j++) {
if (d[i][j] == INT32_MAX && d[i][k] != INT32_MAX && d[k][j] != INT32_MAX) {
d[i][j] = d[i][k] + d[k][j];
}
}
}
}
}
int main() {
cin >> m;
for (int i = 0; i < 26; i++) {
for (int j = 0; j < 26; j++) {
d[i][j] = INT32_MAX;
}
}
while (m--) {
cin >> fr >> s >> to;
d[fr - 'a'][to - 'a'] = 1; //fr은 to이다를 표현
}
floydWashall();
cin >> n;
while (n--) {
cin >> fr >> s >> to;
if (d[fr - 'a'][to - 'a'] != INT32_MAX) { //fr은 to이다를 정의할 수 있으면
cout << "T" << '\n';
}
else { //fr은 to이다를 정의할 수 없으면
cout << "F" << "\n";
}
}
}'백준' 카테고리의 다른 글
| 백준1780 - 종이의 갯수 (0) | 2020.04.07 |
|---|---|
| 백준14938 - 서강그라운드 (0) | 2020.04.05 |
| 백준16401 - 과자 나눠주기 (0) | 2020.04.02 |
| 백준1166 - 선물 (0) | 2020.03.31 |
| 백준12101 - 1, 2, 3 더하기 2 (0) | 2020.03.30 |