Doby's Lab

[알고리즘] 백준 10159번: 저울 (C++) 본문

PS/BOJ

[알고리즘] 백준 10159번: 저울 (C++)

도비(Doby) 2021. 12. 6. 15:18

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

 

10159번: 저울

첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물건 쌍의 개수 M이 주어진다. 단, 5 ≤ N ≤ 100 이고, 0 ≤ M ≤ 2,000이다. 다음 M개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩

www.acmicpc.net

 

개인적으로 (https://draw-code-boy.tistory.com/151) 이 문제와 똑같다고 느껴졌다.

저 문제를 풀지 않고, 이 문제를 시도했으면 어렵게 느껴졌을 거 같다.

플로이드 와샬로 나올 수 있는 문제 키워드 중 하나일 거 같다.

 

#include <iostream>
#include <cmath>
#define MAX 500 + 1
#define INF 987654321
using namespace std;

int graph[MAX][MAX];
int cache[MAX][MAX];
int n, m;

void floydWarshall() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			cache[i][j] = graph[i][j];
		}
	}

	for (int k = 1; k <= n; k++) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				if (cache[i][k] != INF && cache[k][j] != INF) {
					cache[i][j] = min(cache[i][j], cache[i][k] + cache[k][j]);
				}
			}
		}
	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (i == j) cache[i][j] = 0;
		}
	}
}

int main() {
	cin >> n >> m;

	// init
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			graph[i][j] = INF;
		}
	}

	for (int i = 0; i < m; i++) {
		int a, b;
		cin >> a >> b;
		graph[a][b] = 1;
	}

	floydWarshall();

	for (int i = 1; i <= n; i++) {
		int cnt = 0;

		// i로부터 갈 수 있는 노드가 몇 개인가
		for (int j = 1; j <= n; j++) {
			if (cache[i][j] == INF || cache[i][j] == 0) continue;
			else cnt++;
		}

		// 도착 노드가 i가 되는 경우는 몇 개인가
		for (int j = 1; j <= n; j++) {
			if (cache[j][i] == INF || cache[i][j] == 0) continue;
			else cnt++;
		}

		cout << (n - 1) - cnt << '\n';
	}

	return 0;
}
728x90