首页 > 其他分享 >abc291E 寻找唯一排列

abc291E 寻找唯一排列

时间:2024-03-17 23:22:42浏览次数:32  
标签:排列 int rep 寻找 abc291E 条件 ind

有数组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 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;
}

标签:排列,int,rep,寻找,abc291E,条件,ind
From: https://www.cnblogs.com/chenfy27/p/18079414

相关文章

  • 攻击树测试 题目8寻找最近三个月内公布或发布的新产品或系统,
选择一个你了解的资产并
    攻击树测试题目要求用(你的学号%10)+1确定序号,完成下面的内容:1给如何偷汽车创建攻击树。在这道题以及其他攻击树的练习题中,可以通过图来描述攻击树,也可以使用一个编号的列表来描述攻击树(比如,1,1.1,1.2,1.2.1,1.2.2,1.3,…)。2给如何不付费进入体育馆创建攻击树。3给如何不付......
  • 回溯:排列回溯和组合回溯的区别
    在形式上,最明显的问题就是[1,2]和[2,1]这两个list在排列中是正确的,而在组合中一般只有前者排列回溯注重元素的顺序,并且允许重复元素的出现,而组合回溯则不考虑元素的顺序。排列回溯:通常使用一个boolean数组来标记哪些元素已经被选择,哪些尚未被选择在递归的每一层,我们......
  • 洛谷题单指南-二叉树-P1030 [NOIP2001 普及组] 求先序排列
    原题链接:https://www.luogu.com.cn/problem/P1030题意解读:已知中序、后序,求先序。解题思路:与洛谷题单指南-二叉树-P1827[USACO3.4]美国血统AmericanHeritage非常类似,不在介绍过程,直接给出代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;stringin,post......
  • 全排列树层/树枝去重
    去重:1.对数组进行排序,保证相同数据能放在一起Arrays.sort(nums);2.进行去重:当这个元素与前一个元素相等,且i>0,并且前一个元素没被使用的时候进行去重。树层去重为什么前一个元素没被使用就可以去重:在回溯操作中,树层上的变化一直都是前一个元素的使用变成这个元素的使用。而树......
  • 数字排列 - 华为OD统一考试(C卷)
    OD统一考试(C卷)分值:200分题解:Java/Python/C++题目描述小明负责公司年会,想出一个趣味游戏:屏幕给出1−9中任意4个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第n位置的数字,其中n为给出数字中最大的(如果不到这么多数字则......
  • leetcode回溯法典型例题:39.组合总和、40组合总和 II、46.全排列、47.全排列 II
    leetcode回溯法典型例题:39.组合总和、40组合总和II、46.全排列、47.全排列II39.组合总和39.组合总和-力扣(LeetCode)思路构建组合使用递归的方式构建出所有组合。由题意可知,元素可以无限取用,所以我们构建的时候每确定一个数字,进入更深层递归的时候,每个数字都可以取用(此......
  • [LeetCode][LCR174] 寻找二叉搜索树中的目标节点
    题目LCR174.寻找二叉搜索树中的目标节点某公司组织架构以二叉搜索树形式记录,节点值为处于该职位的员工编号。请返回第cnt大的员工编号。示例1:输入:root=[7,3,9,1,5],cnt=27/\39/\15输出:7示例2:输......
  • 力扣--深度优先算法/回溯算法47.全排列 Ⅱ
    思路分析:使用DFS算法进行全排列,递归地尝试每个可能的排列方式。使用path向量保存当前正在生成的排列,当其大小达到输入数组的大小时,将其加入结果集。使用numvisited向量标记每个数字是否已经被访问过,以确保每个数字在一个排列中只使用一次。在递归过程中,对于每个未访问的......
  • 567. 字符串的排列(中)
    目录题目题解:滑动窗口题目给你两个字符串s1和s2,写一个函数来判断s2是否包含s1的排列。如果是,返回true;否则,返回false。换句话说,s1的排列之一是s2的子串示例1:输入:s1="ab"s2="eidbaooo"输出:true解释:s2包含s1的排列之一("ba").示例2:输入:s1=......
  • 153. 寻找旋转排序数组中的最小值(中)
    目录题目题解:二分题目已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,7,0,1,2]若旋转7次,则可以得到[0,1,2,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a......