티스토리 뷰

반응형

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

 

10159번: 저울

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

www.acmicpc.net

입력으로 주어지는 물건의 대소관계를 그래프로 표현하면 사이클이 없는 방향 그래프(DAG)로 표현할 수 있고 결과를 출력하기 위해 두 물건을 비교해야 하므로 위상정렬이 먼저 떠올랐습니다.

하지만 모든 물건들간에 비교가 필요하고 N의 최대가 100이라는 점에서 플로이드 와샬 알고리즘을 해결방법으로 생각해 낼 수 있었습니다.

 

 

  • 필요한 배경지식

플로이드 와샬 알고리즘 : Floyd Warshall

 

 

 

  • 문제 해결 방법

플로이드 와샬 알고리즘만 떠올릴 수 있다면 해결은 간단합니다.

물건사이의 대소 관계를 그래프로 표현하고 플로이드 와샬 알고리즘을 이용하여 물건 i,j사이의 경로가 있는지 없는지만 판단하면 문제를 해결할 수 있습니다.

물건 i와 j를 비교할때, i에서 j까지의 경로 또는 j에서 i까지의 경로 둘 중 하나만 존재하면 물건 i와 j의 비교 결과를 알 수 있으므로 그 결과를 출력해 주면 됩니다.

 

 

 

 

  • C++ 전체 코드
#include<bits/stdc++.h> using namespace std; int N,M; bool m[101][101]{}; int main() { ​​​​ios_base::sync_with_stdio(0); ​​​​cin.tie(0); ​​​​cin>>N>>M; ​​​​int a,b; ​​​​for(int i=0; i<M; i++){ ​​​​​​​​cin>>a>>b; ​​​​​​​​m[a][b] = true; ​​​​} ​​​​for(int k=1; k<=N; k++){ ​​​​​​​​for(int i=1; i<=N; i++){ ​​​​​​​​​​​​for(int j=1; j<=N; j++){ ​​​​​​​​​​​​​​​​if(m[i][k] && m[k][j]) m[i][j] = true; ​​​​​​​​​​​​} ​​​​​​​​} ​​​​} ​​​​for(int i=1; i<=N; i++){ ​​​​​​​​int cnt = 0; ​​​​​​​​for(int j=1; j<=N; j++){ ​​​​​​​​​​​​if(!m[i][j] && !m[j][i]) { ​​​​​​​​​​​​​​​​if(i==j) continue; ​​​​​​​​​​​​​​​​cnt++; ​​​​​​​​​​​​} ​​​​​​​​} ​​​​​​​​cout<<cnt<<'\n'; ​​​​} }

 

반응형

'알고리즘 공부 > 문제풀이' 카테고리의 다른 글

백준 14267번 - 회사 문화 1  (1) 2021.05.25
백준 17780번 - 새로운 게임  (0) 2021.05.24
백준 1368번 - 물대기  (0) 2021.05.22
백준 2512번 - 예산  (0) 2021.05.21
백준 10775번 - 공항  (0) 2021.05.21
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함