1203. 專案管理
公司共有n
個專案和m
個小組,每個專案要不無人接手,要不就由m
個小組之一負責。
group[i]
表示第i
個專案所屬的小組,如果這個專案目前無人接手,那麼group[i]
就等於-1
。(專案和小組都是從零開始編號的)小組可能存在沒有接手任何專案的情況。
請你幫忙按要求安排這些專案的進度,並返回排序後的專案列表:
如果存在多個解決方案,只需要返回其中任意乙個即可。如果沒有合適的解決方案,就請返回乙個空列表。
示例 1:
輸入:n = 8, m = 2, group = [-1,-1,1,0,0,1,0,-1], beforeitems = [,[6],[5],[6],[3,6],,,]
輸出:[6,3,4,1,5,2,0,7]
示例 2:
輸入:n = 8, m = 2, group = [-1,-1,1,0,0,1,0,-1], beforeitems = [,[6],[5],[6],[3],,[4],]
輸出:解釋:與示例 1 大致相同,但是在排序後的列表中,4 必須放在 6 的前面。
思路:從依賴關係我們可以看出,這裡考察的是拓撲排序。本題存在兩種拓撲關係,一是集合之間的依賴,一是專案之間的依賴。本題我們先解決組之間的依賴關係,將每個小組負責的專案結合抽象成點,若不同的組之間,存在專案有依賴關係,則在組之間建邊,於是可以對組構建拓撲序,如果不存在拓撲序,則不存在答案(如果組之間不存在拓撲排序,即組之間形成了迴圈依賴,那麼即便專案之間存在拓撲排序,也無法滿足題目要求的同乙個組內的專案在輸出的位置相鄰)。當我們得到了組的拓撲關係,對組再進行一次拓撲排序即可,如果組無法拓撲排序或者每個組內的元素無法拓撲排序,則題目要求的拓撲排序便不存在。需要注意的是,本題可能會存在乙個集合到乙個集合的n條邊,為了便於儲存,我們將n條邊集成為權值為n的一條有向邊。
class solution
}int s, i, v, w;
while(!que.empty())}}
return topo;
}vectoritemtoposort(unordered_sethash, unordered_setarclist, int in)
}int s, i, v, w;
while(!que.empty())}}
return topo;
}vectorsortitems(int n, int m, vector& group, vector>& beforeitems)
itemset[group[i]].insert(i); // itemset[i]: i號組內的元素集合
sethash.insert(group[i]); // 組編號的集合
}// 2. 將資料重新組織為有向邊關係,構建組、專案的依賴關係
for(i = 0; i < len; ++ i)}}
// 3. 根據組依賴關係得到組的拓撲序
vectortopo = settoposort(sethash, setadjoin, setin);
if(topo.size() != sethash.size())
// 4. 根據組的拓撲序順序 拓撲排列集合
for(i = 0; i < topo.size(); ++ i)
}return ans.size() == n ? ans : vector();}};
1203 專案管理
公司共有 n 個專案和 m 個小組,每個專案要不無人接手,要不就由 m 個小組之一負責。group i 表示第 i 個專案所屬的小組,如果這個專案目前無人接手,那麼 group i 就等於 1。專案和小組都是從零開始編號的 小組可能存在沒有接手任何專案的情況。請你幫忙按要求安排這些專案的進度,並返回...
LeetCode 1203 專案管理(Hard)
題目鏈結 python 兩次拓撲排序100 雙重拓撲排序 python 0115 兩次 拓撲排序 220 ms,38 mb defsortitems self,n int,m int,group list int pres list list int list int 拓撲排序 基於bfs排序 佇列...
專案管理 (1) 專案管理流程
2.專案啟動前是整個專案從零到一的乙個過程,對於專案整體至關重要。在啟動前一定要明確專案的目的 目標,需要達成什麼樣的效果。需從容不迫的開啟專案。3.專案計畫階段。一但專案決定要做了,就要進入專案計畫階段,這個階段要考慮的都是專案進行中的實際問題。專案計畫包括 進度計畫,風險計畫,溝通計畫 4.專案...