abc291E 寻找唯一排列
有数组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 namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=b;i>=a;i--)
const int N = 200005;
int n, m, ind[N], out[N];
vector<int> adj[N], ans={0};
void solve() {
cin >> n >> m;
rep(i,1,m) {
int x, y;
cin >> x >> y;
adj[x].push_back(y);
ind[y] += 1;
}
queue<int> q;
rep(i,1,n) if(ind[i] == 0) {
q.push(i);
}
while (!q.empty()) {
if (q.size() != 1) {
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);
}
}
}
cout << "Yes\n";
rep(i,1,n) out[ans[i]] = i;
rep(i,1,n) cout << out[i] << " ";
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
int t = 1;
while (t--) solve();
return 0;
}