abc291E Find Permutation
有数组A[N],其元素值正好是1~N的一个排列。现在不知道具体的A,但已知M组条件,对于(x,y),有A[x]<A[y],问根据这m组条件能否唯一确定A,如果可以,输出Yes和A,否则输出No。
2<=N,M<=2E5; 1<=x[i],y[i]<=N
分析:排列唯一有两个等价条件:
- bfs拓扑排序过程中,队列时刻保持只有1个元素。
- 如果看成dag,最长路径的长度为N-1。
条件1一般用bfs实现,而条件2用dfs来做。这里根据条件1来求。
#include <bits/stdc++.h>
using i64 = long long;
void solve() {
int N, M;
std::cin >> N >> M;
std::vector<int> ind(N);
std::vector<std::vector<int>> adj(N);
for (int i = 0; i < M; i++) {
int x, y;
std::cin >> x >> y;
x--, y--;
adj[x].push_back(y);
ind[y] += 1;
}
std::queue<int> q;
for (int i = 0; i < N; i++) {
if (ind[i] == 0) {
q.push(i);
}
}
std::vector<int> ans;
while (!q.empty()) {
if (q.size() != 1) {
std::cout << "No\n";
return;
}
auto t = q.front();
q.pop();
ans.push_back(t);
for (auto i : adj[t]) {
ind[i] -= 1;
if (ind[i] == 0) {
q.push(i);
}
}
}
std::cout << "Yes\n";
std::vector<int> out(N);
for (int i = 0; i < N; i++) {
out[ans[i]] = i;
}
for (int i = 0; i < N; i++) {
std::cout << out[i] + 1 << " \n"[i + 1 == N];
}
}
int main() {
std::cin.tie(0)->sync_with_stdio(0);
int t = 1;
while (t--) solve();
return 0;
}
浙公网安备 33010602011771号