- 문제 링크 : boj.kr/1432
- 난이도 : P4
- 태그 : 위상 정렬, 우선순위 큐
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n;
cin >> n;
vector<vector<int>> adj(n+1);
vector<int> cnt(n+1, 0);
for(int i = 1; i <= n; i++) {
string s;
cin >> s;
for(int j = 0; j < n; j++) {
if(s[j] == '1') {
adj[j+1].emplace_back(i);
cnt[i]++;
}
}
}
priority_queue<int> _pq;
for(int i = 1; i <= n; i++) {
if(cnt[i] == 0) _pq.push(i);
}
vector<int> ans(n+1);
int num = n;
while(!_pq.empty()) {
int curr = _pq.top(); _pq.pop();
ans[curr] = num--;
for(auto u : adj[curr]) {
cnt[u]--;
if(cnt[u] == 0) _pq.push(u);
}
}
if(num != 0) {
cout << -1;
return 0;
}
for(int i = 1; i <= n; i++) cout << ans[i] << " ";
return 0;
}
풀이
되는 것부터 작은 번호를 매기면 반례가 생긴다.
안 되는 것부터 큰 번호를 매겨주면 된다.
728x90
'PS' 카테고리의 다른 글
BOJ 9463 : 순열 그래프 (0) | 2024.09.14 |
---|---|
BOJ 11003 : 최솟값 찾기 (0) | 2024.09.13 |
BOJ 10165 : 버스 노선 (0) | 2024.09.11 |
BOJ 3572 : Billboard (1) | 2024.09.10 |
BOJ 9426 : 중앙값 측정 (1) | 2024.09.09 |