본문 바로가기

백준

백준15723 - n단 논법

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