본문 바로가기

알고리즘/BOJ

10159번

10159번 - 저울


저울의 크기 비교하는 문제인데, 노드로 나타내면, 방향 그래프로 나타낼 수 있다는 점을 알 수 있다.


따라서 각 쌍이 연결이 되어있는지 여부를 파악하는 플로이드 알고리즘을 통해 풀 수 있다.


플로이드 알고리즘에서 for문 3개 중, 가장 바깥 쪽이 k 인데,


맨 처음에 풀 때, 가장 안쪽을 k 로 해서 틀렸었다.


플로이드 알고리즘 정확히 기억하기!


<정답 코드>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
#include<vector>
 
using namespace std;
const int INF = 987654321;
int main()
{
    int n, m;
    scanf("%d%d"&n, &m);
    vector<vector<bool>> D(n + 1vector<bool>(n + 1false));
    for (int i = 0; i < m; i++)
    {
        int a, b;
        scanf("%d%d"&a, &b);
        D[a][b] = true;
    }
    
    for (int k = 1; k <= n; k++)
    {
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                D[i][j] = D[i][j] || (D[i][k] && D[k][j]);
            }
        }
    }
 
    for (int i = 1; i <= n; i++)
    {
        int ans = 0;
        for (int j = 1; j <= n; j++)
        {
            if (!D[i][j] && !D[j][i] && i!=j)
            {
                ans++;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

14582번  (0) 2018.01.16
14726번  (0) 2018.01.16
9938번  (0) 2018.01.16
10775번  (0) 2018.01.16
1417번  (0) 2018.01.16