https://www.acmicpc.net/problem/10159
10159번: 저울
첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물건 쌍의 개수 M이 주어진다. 단, 5 ≤ N ≤ 100 이고, 0 ≤ M ≤ 2,000이다. 다음 M개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩 주어진다. 각 줄에는 측정된 물건 번호를 나타내는 두 개의 정수가 공백을 사이에 두고 주어지며, 앞의 물건이 뒤의 물건보다 더 무겁다.
www.acmicpc.net
3중 포문으로 플로이드 와샬 알고리즘을 사용하였습니다.
전체코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define INF 1e9
#define MAX_N 101
int dp[MAX_N][MAX_N];
int dp2[MAX_N][MAX_N];
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int N, Q;
cin >> N >> Q;
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= N; j++) {
dp[i][j] = INF;
dp2[i][j] = INF;
if (i == j) {
dp[i][j] = 0;
dp2[i][j] = 0;
}
}
}
for (int i = 0; i < Q; i++) {
int a, b; cin >> a >> b;
dp[a][b] = 1;
dp2[b][a] = 1;
}
for (int m = 1; m <= N; m++) {
for (int s = 1; s <= N; s++) {
for (int e = 1; e <= N; e++) {
if (dp[s][m] != INF && dp[m][e] != INF)
dp[s][e] = min(dp[s][e], dp[s][m] + dp[m][e]);
}
}
}
for (int m = 1; m <= N; m++) {
for (int s = 1; s <= N; s++) {
for (int e = 1; e <= N; e++) {
if (dp2[s][m] != INF && dp2[m][e] != INF)
dp2[s][e] = min(dp2[s][e], dp2[s][m] + dp2[m][e]);
}
}
}
int num = -1;
for (int i = 1; i <= N; i++) {
int tmp_ans = 0;
for (int j = 1; j <= N; j++) {
if (j == i) continue;
if (dp[i][j] == INF && dp2[i][j] == INF) tmp_ans++;
}
cout << tmp_ans << "\n";
}
}
'알고리즘 > [C++]BOJ' 카테고리의 다른 글
[백준BOJ] 9205 맥주 마시면서 걸어가기 (0) | 2019.10.06 |
---|---|
[백준BOJ] 1389 케빈 베이컨의 6단계 법칙 (0) | 2019.10.05 |
[BOJ백준] 11657 타임머신 (0) | 2019.10.05 |