题目链接


项目之间存在依赖关系,所以项目要进行拓扑排序。
同一组的项目要拍在一起,所以组也要拓扑排序。
对于没人接管的项目,给他一个新的编号。
最后将拓扑排序之后的项目按照项目的拓扑排序结果进行分配。

class Solution {public:vector<int> sortItems(int n, int m, vector<int>& group, vector<vector<int>>& beforeItems) {// 给无人接手的项目编号for (int &it : group) {if (it == -1) {it = m++;}}// 统计入度、见图vector<vector<int>> groupAdj(m, vector<int>());vector<vector<int>> itemAdj(n, vector<int>());vector<int> groupIn(m, 0);vector<int> itemIn(n, 0);for (int i = 0; i < n; ++i) {for (int j : beforeItems[i]) {itemAdj[j].push_back(i);itemIn[i]++;}}for (int i = 0; i < n; ++i) {for (int &j : beforeItems[i]) {if (group[i] != group[j]) {groupAdj[group[j]].push_back(group[i]);groupIn[group[i]]++;}}}// 得到group和item的拓扑结果vector<int> groupTop = topSort(groupAdj, groupIn);vector<int> itemTop = topSort(itemAdj, itemIn);if (groupTop.empty() || itemTop.empty()) {return vector<int>();}// 将item的拓扑结果按照group的拓扑结果重新分配unordered_map<int, vector<int>> mp;for (int &i : itemTop) {mp[group[i]].push_back(i);}vector<int> ret;for (int &i : groupTop) {for (int &j : mp[i]) {ret.push_back(j);}}return ret;}vector<int> topSort(vector<vector<int>> adj, vector<int> in) {queue<int> q;for (int i = 0; i < (int)in.size(); ++i) {if (!in[i]) {q.push(i);}}vector<int> ret;while(!q.empty()) {int f = q.front();q.pop();ret.push_back(f);for (int i : adj[f]) {if (--in[i] == 0) {q.push(i);}}}return ret.size() == in.size() ? ret : vector<int>();}
};

拓扑排序 - 项目管理相关推荐

  1. leetcode 1203. 项目管理(拓扑排序)

    公司共有 n 个项目和 m 个小组,每个项目要不无人接手,要不就由 m 个小组之一负责. group[i] 表示第 i 个项目所属的小组,如果这个项目目前无人接手,那么 group[i] 就等于 -1 ...

  2. LeetCode 1203. 项目管理(两次拓扑排序)

    文章目录 1. 题目 2. 解题 1. 题目 公司共有 n 个项目和 m 个小组,每个项目要不无人接手,要不就由 m 个小组之一负责. group[i] 表示第 i 个项目所属的小组,如果这个项目目前 ...

  3. 拓扑排序(Topological Sorting)

    拓扑排序(Topological Sorting) 这篇文章我们来讲一下拓扑排序,这可是一个很重要也很实用的算法,面试中常考,工作中常用,无论是互联网公司还是金融公司,考算法的时候都贼喜欢问这个. 拓 ...

  4. 第5-2课:图的拓扑排序

    拓扑排序常用来确定一个依赖关系集中.事物发生的顺序.一个典型的应用场景就是在项目管理或工程实施中安排各种生产活动的计划,在考虑各种活动的依赖关系的基础上,安排各种活动的开始时间,使得项目或工程能够以高 ...

  5. 数据结构与算法——31. 图的应用:拓扑排序、强连通分支、最短路径问题、最小生成树

    文章目录 一.拓扑排序(Topological Sort) 实现思路 二.强连通分支 1. 转置的概念 2. 强连通分支算法:Kosaraju算法思路 三.最短路径问题 1. 最短路径问题:Dijks ...

  6. 【图论】有向无环图的拓扑排序

    1. 引言 有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环.常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度.拓扑排序是对DA ...

  7. C#实现有向无环图(DAG)拓扑排序

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在 ...

  8. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

  9. usaco frame up(所有拓扑排序的输出)

    先根据图建图再拓扑排序. /** ID: jinbo wu TASK: frameup LANG:C++ */ #include<bits/stdc++.h> using namespac ...

最新文章

  1. 谷歌浏览器删除相同重复无效书签
  2. PHP nl2br()格式化输出
  3. 11行代码AC——比紫书优化,例题2-3 近似计算——解题报告
  4. 算法实践--最小生成树(Kruskal算法)
  5. 互联网“高薪榜”曝光,物联网将接棒?
  6. python comprehensions_Python_基础
  7. 在vue中实现picker样式_基于vue的颜色选择器vue-color-picker
  8. async 与 await
  9. 从零开始学习makefile(7) makefile的filter的作用
  10. 网页设计Web尺寸规范
  11. 网站通用 敏感词列表
  12. 文字转语音怎么做?分享三种配音方法,真人语音很逼真
  13. @interface List
  14. 一些Winodws mobile相关资料的整理
  15. 重装后显示计算机无法联网,Win10重装系统后无法联网如何解决
  16. Unity Shader graph 毒液
  17. mvc2 mvc_迅捷的MVC
  18. (转载)基于LBS地图的开发,满足地图上有头像的需求
  19. linux下c使用lzma_使用 LZMA SDK
  20. python util

热门文章

  1. Ng第十二课:支持向量机(Support Vector Machines)(一)
  2. 【bzoj1212】[HNOI2004]L语言 AC自动机
  3. javascript基础07
  4. USACO shuttle
  5. 【Socket】linux网络多路复用IO技术
  6. 我设计的简单事务控制
  7. PHP控制转盘抽奖代码,PHP 根据概率 实现抽奖转盘算法 代码
  8. 【数据结构与算法】之深入解析“修剪二叉搜索树”的求解思路与算法示例
  9. Python之深入解析Vulture如何一键找出项目中所有无效的代码
  10. LeetCode Algorithm 811. 子域名访问计数