码迷,mamicode.com
首页 > 编程语言 > 详细

拓扑排序-1203. 项目管理。。。没看懂

时间:2021-01-13 11:29:18      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:main   mgr   class   int   graph   需要   group   rap   static   

package Leetcode;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * 公司共有 n 个项目和  m 个小组,每个项目要不无人接手,要不就由 m 个小组之一负责。
 * 
 * group[i] 表示第 i 个项目所属的小组,如果这个项目目前无人接手,那么 group[i]
 * 就等于 -1。(项目和小组都是从零开始编号的)小组可能存在没有接手任何项目的情况。
 * 
 * 请你帮忙按要求安排这些项目的进度,并返回排序后的项目列表:
 * 
 * 同一小组的项目,排序后在列表中彼此相邻。 项目之间存在一定的依赖关系,我们用一个列表
 * beforeItems 来表示,其中 beforeItems[i] 表示在进行第 i 个项目前(位于第 i 个项目左侧)应该完成的所有项目。
 * 如果存在多个解决方案,只需要返回其中任意一个即可。如果没有合适的解决方案,就请返回一个 空列表 。
 */
//没看懂
public class test1203 {
    public static void main(String[] args) {
        int n=8;
        int m=2;
        int []group={-1,-1,1,0,0,1,0,-1};
        List<List<Integer>> beforeItems=new ArrayList<>();
        for(int i=0;i<8;i++){
            List<Integer> list=new ArrayList<>();
            if(i==0||i==5||i==6||i==7){
                beforeItems.add(new ArrayList());
            }else if(i==1||i==3){
                list.add(6);
                beforeItems.add(new ArrayList<>(list));
                
            }else if(i==2){
                list.add(5);
                beforeItems.add(new ArrayList<>(list));
            }else if(i==4){
                list.add(3);
                list.add(6);
                beforeItems.add(new ArrayList<>(list));
            }
            
        }
        sortItems(n,m,group,beforeItems);

    }
    //拓扑排序
    public static int[] sortItems(int n, int m, int[] group, List<List<Integer>> beforeItems) {
        List<List<Integer>> groupItem=new ArrayList<>();
        for(int i=0;i<n+m;++i){
            groupItem.add(new ArrayList<>());
        }
        //组间和组内依赖图
        List<List<Integer>> groupGraph=new ArrayList();
        for(int i=0;i<n+m;++i){
            groupGraph.add(new ArrayList<>());
        }
        List<List<Integer>> itemGraph=new ArrayList<>();
        for(int i=0;i<n;++i){
            itemGraph.add(new ArrayList<>());
        }
        //组间和组内入度数组
        int []groupDegree=new int[n+m];
        int []itemDegree=new int[n];
        List<Integer> id=new ArrayList<>();
        for(int i=0;i<n+m;++i){
            id.add(i);
        }
        //// 给未分配的 item 分配一个 groupId
        int leftId=m;
        for(int i=0;i<n;++i){
            if(group[i]==-1){
                group[i]=leftId;
                leftId++;
            }
            groupItem.get(group[i]).add(i);
        }
        // 依赖关系建图
        for (int i = 0; i < n; ++i) {
            int curGroupId = group[i];
            for (int item : beforeItems.get(i)) {
                int beforeGroupId = group[item];
                if (beforeGroupId == curGroupId) {
                    itemDegree[i] += 1;
                    itemGraph.get(item).add(i);   
                } else {
                    groupDegree[curGroupId] += 1;
                    groupGraph.get(beforeGroupId).add(curGroupId);
                }
            }
        }
        // 组间拓扑关系排序
        List<Integer> groupTopSort = topSort(groupDegree, groupGraph, id); 
        if (groupTopSort.size() == 0) {
            return new int[0];
        }
        int[] ans = new int[n];
        int index = 0;
        // 组内拓扑关系排序
        for (int curGroupId : groupTopSort) {
            int size = groupItem.get(curGroupId).size();
            if (size == 0) {
                continue;
            }
            List<Integer> res = topSort(itemDegree, itemGraph, groupItem.get(curGroupId));
            if (res.size() == 0) {
                return new int[0];
            }
            for (int item : res) {
                ans[index++] = item;
            }
        }
        return ans;
    }
    public static List<Integer> topSort(int[] deg, List<List<Integer>> graph, List<Integer> items) {
        Queue<Integer> queue = new LinkedList<Integer>();
        for (int item : items) {
            if (deg[item] == 0) {
                queue.offer(item);
            }
        }
        List<Integer> res = new ArrayList<Integer>();
        while (!queue.isEmpty()) {
            int u = queue.poll(); 
            res.add(u);
            for (int v : graph.get(u)) {
                if (--deg[v] == 0) {
                    queue.offer(v);
                }
            }
        }
        return res.size() == items.size() ? res : new ArrayList<Integer>();
    }

    
}

 

拓扑排序-1203. 项目管理。。。没看懂

标签:main   mgr   class   int   graph   需要   group   rap   static   

原文地址:https://www.cnblogs.com/jieyi/p/14266930.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!