日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

拓扑排序 - 项目管理

發布時間:2024/4/18 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拓扑排序 - 项目管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接


項目之間存在依賴關系,所以項目要進行拓撲排序。
同一組的項目要拍在一起,所以組也要拓撲排序。
對于沒人接管的項目,給他一個新的編號。
最后將拓撲排序之后的項目按照項目的拓撲排序結果進行分配。

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>();} };

總結

以上是生活随笔為你收集整理的拓扑排序 - 项目管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。