chenfy27的刷题记录

导航

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

分析:排列唯一有两个等价条件:

  1. bfs拓扑排序过程中,队列时刻保持只有1个元素。
  2. 如果看成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;
}

posted on 2024-03-17 23:16  chenfy27  阅读(13)  评论(0)    收藏  举报