采用小根堆解题,代码可能有些冗余但思路很清晰:
- 数据输入同时用数组保存每个点的入度(代码部分使用了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(); } } }