采用小根堆解题,代码可能有些冗余但思路很清晰:
- 数据输入同时用数组保存每个点的入度(代码部分使用了vector解决);
- 设计小根堆排序规则:如果入读一样按照字典大小排序,入度不同则按照入读大小排序;
- 扫描入读数组,将所有点入队;
- 依次输出队头元素;
如有不足,请不吝赐教!
#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();
}
}
}

京公网安备 11010502036488号