当前位置: 首页 > news >正文

每日OJ_牛客_NC316体育课测验(二)_拓扑排序_C++_Java

目录

牛客_NC316体育课测验(二)_拓扑排序

题目解析

C++代码

Java代码


牛客_NC316体育课测验(二)_拓扑排序

体育课测验(二)_牛客题霸_牛客网

描述:

        体育课共有numProjectnumProject个考核项目,编号为00到numProject−1numProject−1,考核中每两个项目被划分为一组得到分组数组groupsigroupsi​,现规定若想完成项目groupsi[0]groupsi​[0],必须先完成groupsi[1]groupsi​[1]。保证所有分组互不相同,若分组情况能顺利完成考核,请返回任意的一个完成顺序,否则返回空数组 。

数据范围:

1≤numProject≤2000
1≤groupsi.length≤numProject∗(numProject−1)


题目解析

拓扑排序类型题:

  1. 起始时,将所有入度为 0 的节点进行入队(入度为 0,说明没有边指向这些节点,将它们放到拓扑排序的首部,不会违反拓扑序定义)。
  2. 从队列中进行节点出队操作,出队序列就是对应我们输出的拓扑序。对于当前弹出的节点 x,遍历x 的所有出度y,即遍历所有由 x直接指向的节点y,对y做入度减一操作(因为x节点已经从队列中弹出,被添加到拓扑序中,等价于x节点从有向图中被移除,相应的由x发出的边也应当被删除,带来的影响是与 x相连的节点y的入度减一)。
  3. 对y进行入度减一之后,检查 y的入度是否为0,如果为0则将y入队(当y的入度为0,说明有向图中在y前面的所有的节点均被添加到拓扑序中,此时 可以作为拓扑序的某个片段的首部被添加,而不是违反拓扑序的定义)。
  4. 循环流程 2、3 直到队列为空。

C++代码

class Solution {
public:
    vector<int> findOrder(int numProject, vector<vector<int> >& groups) {
        vector<vector<int>> edg(numProject);
        vector<int> in(numProject);

        for(auto& e : groups)
        {
            int a = e[0], b = e[1];
            edg[b].push_back(a); // b->a
            in[a]++;
        }

        queue<int> q;
        for(int i = 0; i < numProject; ++i)
        {
            if(in[i] == 0)
                q.push(i);
        }
        vector<int> ret;
        while(q.size())
        {
            int x = q.front();
            q.pop();
            ret.push_back(x);
            for(auto& e : edg[x])
            {
                if(--in[e] == 0)
                    q.push(e);
            }
        }
        // if(ret.size() == numProject)
        //     return ret;
        // return {};
        return ret.size()== numProject ? ret : (ret.clear(), ret);
    }
};

Java代码

import java.util.*;
public class Solution {
    public ArrayList<Integer> findOrder (int n, ArrayList<ArrayList<Integer>>  groups) 
    {
        List<List<Integer>> edges = new ArrayList<>(); // 存储边
        for(int i = 0; i < n; i++)
        {
            edges.add(new ArrayList<>());
        }
        int[] in = new int[n]; // ⼊度
        // 1. 建图
        for(int i = 0; i < groups.size(); i++)
        {
            int a = groups.get(i).get(0), b = groups.get(i).get(1); // b -> a
            in[a]++;
            edges.get(b).add(a);
        }
        Queue<Integer> q = new LinkedList<>();
        // 2. ⼊度为 0 的点加⼊到队列中
        for(int i = 0; i < n; i++)
        {
            if(in[i] == 0)
            {
                q.add(i);
            }
        }
        ArrayList<Integer> ret = new ArrayList<>();
        // 3. 拓扑排序(BFS) 
        while(!q.isEmpty())
        {
            int a = q.poll();
            ret.add(a);
            for(int b : edges.get(a)) // a -> b
            {
                if(--in[b] == 0)
                {
                    q.add(b);
                }
            }
        }

        if(ret.size() == n)
            return ret;
        else
            return new ArrayList<>();
    }
}

相关文章:

  • Typora安装教程(附安装包)Typora下载
  • 小结:BGP 的自动聚合与手动聚合
  • ENSP配置AAA验证
  • 鸿蒙日期格式工具封装及使用
  • Hadoop第一课(配置linux系统)
  • 【软考-架构】1.3、磁盘-输入输出技术-总线
  • Pico 4 Enterprise(企业版)与Unity的交互-有线串流调试篇
  • Spring 源码硬核解析系列专题(十二):Spring Integration 的消息驱动源码解析
  • 一次连接,可能会多次创建socket???
  • 大模型技术:重塑未来的力量
  • Spring Boot 异步编程深入剖析
  • 人工智能领域顶级期刊
  • swift 开发效率提升工具
  • 校园快递助手小程序毕业系统设计
  • STM32Cubemx配置RTTHread工程
  • [SWPUCTF 2022 新生赛]1z_unserialize
  • DeepSeek R1:揭示适度思考在信息处理中的关键作用
  • 4070Super安装GPU版本pytorch记录
  • Windows本地Docker+Open-WebUI部署DeepSeek
  • 11.24 SpringMVC(1)@RequestMapping、@RestController、@RequestParam
  • 雀巢中国回应“巴黎水”丑闻报告:在中国销售的产品均符合相关法律法规要求
  • 东南亚五大经济体一季度增长放缓,美国关税大棒或阻全年增长
  • 多名幼师殴打女童被行拘后续,盘锦市教育局工作人员:该局将专项整治全市幼儿园
  • 以色列媒体:哈马斯愿意释放部分人员换取两个月停火
  • 中国首艘海洋级智能科考船“同济”号试航成功,可搭载水下遥控机器人
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯被执行死刑