PTA任务拓扑排序

一、题目描述

 

 二、解题思路

  这题是一个拓扑排序的模板题,所谓拓扑排序就是每次把度为0的依次输出,但是要做到字典序最小该怎么办呢?----上网学了手,用优先队列(小根堆)每次会把最小的放在队首,故最终的答案一定是最小的字典序。

三、代码实现

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 bool vis[110];
 4 int heads[110];
 5 int in[110];
 6 struct node{
 7     int from;
 8     int to;
 9     int nxt;
10 }e[11100];
11 int cnt;
12 vector <int> ans;
13 int n,m;
14 void init()
15 {
16     for(int i = 0;i <= 100;i++)
17         heads[i] = -1;
18 }
19 void add(int u,int v)
20 {
21     e[cnt].from = u;
22     e[cnt].to = v;
23     e[cnt].nxt = heads[u];
24     heads[u] = cnt;
25     cnt++;
26 }
27 void solve()
28 {
29     priority_queue <int,vector<int>,greater<int>> que;
30     for(int i = 0;i < n;i++)
31         if(!in[i])
32             que.push(i);
33     while(!que.empty()){
34         int v = que.top();
35         que.pop();
36         if(vis[v]) continue;
37         vis[v] = true;
38         ans.push_back(v);
39         for(int i = heads[v];i != -1;i = e[i].nxt){
40             in[e[i].to]--;
41             if(!vis[e[i].to] && !in[e[i].to])
42                 que.push(e[i].to);
43         }   
44     }
45 }
46 int main()
47 {
48     cin >> n >> m;
49     init();
50     for(int i = 1;i <= m;i++){
51         int u,v;
52         cin >> u >> v;
53         add(u,v);
54         in[v]++;
55     }
56     solve();
57     int len = ans.size();
58     if(len == n){
59         for(auto u:ans)
60             cout << u << ' ';
61     }
62     else
63         cout << "unworkable project" << endl;
64     return 0;
65 }
posted @ 2022-03-15 15:22  scannerkk  阅读(90)  评论(0)    收藏  举报