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 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}

浙公网安备 33010602011771号