题解 | #任务调度#

任务调度

https://www.nowcoder.com/practice/88d5fa34fe0748e09062e48c6ae6ffc7

采用小根堆解题,代码可能有些冗余但思路很清晰:

  1. 数据输入同时用数组保存每个点的入度(代码部分使用了vector解决);
  2. 设计小根堆排序规则:如果入读一样按照字典大小排序,入度不同则按照入读大小排序;
  3. 扫描入读数组,将所有点入队;
  4. 依次输出队头元素;

如有不足,请不吝赐教!

#include <iostream>
#include <queue>
#include <vector>
using namespace std;


struct node{
    int inNum;      // 入度
    int point;      // 点名称
};
bool operator<(node left,node right){   // 小根堆建立规则,入度最小优先,号码最小优先
    if(left.inNum == right.inNum) return left.point > right.point;
    else return left.inNum>right.inNum;
}


int main(){
    int num;string input;
    while(cin>>num){
        vector<int> in(num);                    //入度表
        for(int i=0;i<num;i++){
            cin>>input;
            // 计算入度
            if(input[6]=='N')continue;          // NULL
            long long unsigned int pos = 10;
            while(pos<input.size()){
                int to = input[pos]-'0';
                in[to]++;
                pos+=6;
            }
        }
        // 构建小根堆
        priority_queue<node> qu;
        for(int i=0;i<in.size();i++){
            node newNode;
            newNode.inNum = in[i];
            newNode.point = i;
            qu.push(newNode);
        }
        // 拓扑排序:
        while(!qu.empty()){
            cout<<"Task"<<qu.top().point<<" ";
            qu.pop();
        }

    }
}

全部评论
写的很好,思路很清晰。很好看懂
点赞 回复 分享
发布于 03-14 21:31 贵州
这也不是拓扑排序,只是把入度递减的排序了一遍,这题数据弱才可以通过,超过了10个节点,字符串的划分也不能这么写。
点赞 回复 分享
发布于 03-10 12:35 陕西

相关推荐

06-23 11:43
门头沟学院 Java
allin校招的烤冷...:我靠,今天中午我也是这个hr隔一个星期发消息给我。问的问题还是一模一样的😅
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务