본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

[boj] 백준 10159 저울 (c++) - 플로이드-와샬

[문제]

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

 

10159번: 저울

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

www.acmicpc.net

 

[풀이]

처음 > 중간, 중간 > 끝이면 처음 > 끝 이다. 이런 삼단논법은 플로이드 와샬을 적용해 풀 수 있다.

 

[코드]

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
#include <cmath>
#include <stack>
#define INF 987654321

using namespace std;

int n, m;
int node[101][101];

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

    cin >> n >> m;

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

    //플로이드-와샬
    for(int k=1; k<=n; k++){
        for(int i=1; i<=n; i++){
            for(int j=1; j<=n; j++){
                if(node[i][k] && node[k][j]) {
                    //처음 > 중간, 중간 > 끝이면 처음 > 끝임.
                    node[i][j] = 1;
                }
            }
        }
    }

    int cnt;
    for(int i=1; i<=n; i++){
        cnt = 0;
        for(int j=1; j<=n; j++){
            if(i==j) continue;
            if(!node[i][j] && !node[j][i]) cnt++;
        }
        cout << cnt << "\n";
    }

}