※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2458번 문제인 키 순서이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/2458 

 

2458번: 키 순서

1번부터 N번까지 번호가 붙여져 있는 학생들에 대하여 두 학생끼리 키를 비교한 결과의 일부가 주어져 있다. 단, N명의 학생들의 키는 모두 다르다고 가정한다. 예를 들어, 6명의 학생들에 대하여

www.acmicpc.net

주어지는 DAG에 Floyd-Warshall 알고리즘을 사용하면, 주어진 간선을 이용해서 노드 k로 올 수 있는 노드 i의 경우 dist[i][k]값이, 노드 k에서 방문할 수 있는 노드 j의 경우 dist[k][j]값이 계산된다는 점을 이용하자.

 

구체적으로, 각 노드 k에 대하여 거리가 계산된 점들의 개수가 전체 노드의 개수 N개와 같다면 노드 k의 사람은 항상 다른 사람과 키를 비교할 수 있다는 뜻이 된다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <cstring>
using namespace std;

int dist[501][501];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N, M; cin >> N >> M;
	memset(dist, 0x3f, sizeof(dist));

	for (int i = 1; i <= N; i++) dist[i][i] = 0;

	while (M--) {
		int x, y; cin >> x >> y;
		dist[x][y] = 1;
	}

	for (int k = 1; k <= N; k++) {
		for (int r = 1; r <= N; r++) {
			for (int c = 1; c <= N; c++) {
				dist[r][c] = min(dist[r][c], dist[r][k] + dist[k][c]);
			}
		}
	}

	int ans = 0;

	for (int k = 1; k <= N; k++) {
		int cnt = 0;
		for (int i = 1; i <= N; i++) if (dist[i][k] < 0x3f3f3f3f || dist[k][i] < 0x3f3f3f3f) cnt++;
		if (cnt == N) ans++;
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 12717 // C++] Crop Triangles (Small)  (0) 2022.05.22
[BOJ 12720 // C++] Number Sets (Large)  (0) 2022.05.22
[BOJ 1746 // C++] 단체 릴레이  (0) 2022.05.22
[BOJ 23258 // C++] 밤편지  (0) 2022.05.21
[BOJ 1719 // C++] 택배  (0) 2022.05.20

+ Recent posts