日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

拓扑排序 - 项目管理

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

題目鏈接


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

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

總結

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

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