Restricted Permutation
問題
D – Restricted Permutation
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2022/2/4 なんとなく解法を思いつく。
ポイント
- トポロジカルソート。
- すべての点が処理できていない場合は
-1
を出力する。
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<int, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 60; // const int INF = 1001001001; // ABC223-D // https://atcoder.jp/contests/abc223/tasks/abc223_d int N, M; vector<vector<int>> graph; vector<int> indegree; vector<int> topologicalSort() { vector<int> result; priority_queue<int, vector<int>, greater<int>> que; rep(i, N) { if(indegree[i] == 0) { que.push(i); } } while(que.empty() == false) { int v = que.top(); que.pop(); int n = graph[v].size(); rep(i, n) { int u = graph[v][i]; indegree[u] -= 1; if(indegree[u] == 0) { que.push(u); } } result.push_back(v); } return result; } int main() { cin >> N >> M; graph.resize(N); indegree.resize(N); rep(i, M) { int A, B; cin >> A >> B; A--; B--; graph[A].push_back(B); indegree[B] += 1; } vector<int> ans = topologicalSort(); rep(i, N) { if(indegree[i] != 0) { cout << -1 << endl; return 0; } } int n = ans.size(); rep(i, n) { cout << ans[i] + 1 << " "; } cout << endl; return 0; }