生活随笔
收集整理的這篇文章主要介紹了
拓扑排序 - 项目管理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
項目之間存在依賴關系,所以項目要進行拓撲排序。
同一組的項目要拍在一起,所以組也要拓撲排序。
對于沒人接管的項目,給他一個新的編號。
最后將拓撲排序之后的項目按照項目的拓撲排序結果進行分配。
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
]]++;}}}vector
<int> groupTop
= topSort(groupAdj
, groupIn
);vector
<int> itemTop
= topSort(itemAdj
, itemIn
);if (groupTop
.empty() || itemTop
.empty()) {return vector
<int>();}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>();}
};
總結
以上是生活随笔為你收集整理的拓扑排序 - 项目管理的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。