풀이

[백준] 10159 - 저울 (c++)

땅왕 2024. 11. 29. 13:01

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

한국정보올림피아드시․도지역본선 > 지역본선 2014 > 고등부 2번

한국정보올림피아드시․도지역본선 > 지역본선 2014 > 중등부 3번

한국정보올림피아드시․도지역본선 > 지역본선 2014 > 초등부 4번

문제 요약

N개의 물건 사이에 M개의 대소관계가 주어진다. (1~N) i물건과 대소관계를 알 수 없는 물건의 개수를 출력해라.

 

풀이 (N^3)

  • 플로이드

각 정점에 갈 수 있는 정점수와 올 수 있는 정점수를 구해야 한다. 정방향과 역방향으로 위상정렬dp를 두 번 돌려서 하는 방법이 바로 떠올랐는데 플로이드 한 번으로 모두 구할 수 있단 걸 알고 플로이드로 구현했다.

#include <bits/stdc++.h>
using namespace std;
#define ll long long

int main() {
    cin.tie(0)->sync_with_stdio(0);
    int n,m;cin>>n>>m;
    vector<vector<bool>> d(n+1,vector<bool>(n+1));
    for(int i=0,u,v;i<m;i++)
        cin>>u>>v,d[u][v]=1;
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(d[i][k]&&d[k][j])
                    d[i][j]=1;

    for(int i=1;i<=n;i++) {
        int cnt=0;
        for(int j=1;j<=n;j++)
            if(!d[i][j]&&!d[j][i])
                cnt++;
        cout<<cnt-1<<'\n';
    }
}