拓扑排序欢乐多

拓扑排序

    • 拓扑排序
      • 一:使用DFS实现
      • 二:使用入度概念以及队列处理
      • 1.使用一般队列
      • 2.使用优先队列(这里定义越大的整数拥有越大的优先级)

一:使用DFS实现

  
  
  
  
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define maxn 10000 + 10
  4. int c[maxn],topo[maxn], k;
  5. int n, r;
  6. vector<int>G[maxn];
  7. int dfs(int u)
  8. {
  9. c[u] = -1;
  10. for(int i=0; i<G[u].size(); i++)
  11. {
  12. int &t = G[u][i];
  13. if(c[t] < 0) return false;
  14. if(!c[t] && !dfs(t)) return false;
  15. }
  16. c[u] = 1;
  17. topo[k--] = u;
  18. return true;
  19. }
  20. bool Topo()
  21. {
  22. for(int i=n; i>=1; i--)
  23. if(!c[i])
  24. {
  25. if(!dfs(i)) return false;
  26. }
  27. return true;
  28. }
  29. int main()
  30. {
  31. while(~scanf("%d%d", &n, &r))
  32. {
  33. int a, b;
  34. k = n;
  35. memset(c, 0, sizeof(c));
  36. for(int i=0; i<r; i++)
  37. {
  38. cin>>a>>b;
  39. G[a].push_back(b);
  40. }
  41. bool flag = Topo();
  42. cout<<flag<<endl;
  43. for(int i=1; i<=n; i++)
  44. cout<<topo[i]<<" ";
  45. }
  46. return 0;
  47. }

Just do it 
相关例题

二:使用入度概念以及队列处理

1.使用一般队列

  
  
  
  
  1. queue<int>q;
  2. //priority_queue<int,vector<int>,greater<int>>q;
  3. //优先队列的话,会按照数值大小有顺序的输出
  4. //此处为了理解,暂时就用简单队列
  5. int topo()
  6. {
  7. for(int i=1; i<=n; i++)
  8. {
  9. if(indegree[i]==0)
  10. {
  11. q.push(i);
  12. }
  13. }
  14. int temp;
  15. while(!q.empty())
  16. {
  17. temp=q.front();//如果是优先队列,这里可以是top()
  18. printf("%d->",temp);
  19. q.pop();
  20. for(inti=1; i<=n; i++) //遍历从temp出发的每一条边,入度--
  21. {
  22. if(map[temp][i])
  23. {
  24. indegree[i]--;
  25. if(indegree[i]==0)q.push(i);
  26. }
  27. }
  28. }
  29. }

2.使用优先队列(这里定义越大的整数拥有越大的优先级)

  
  
  
  
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define maxn 100000+10
  4. struct cmp
  5. {
  6. bool operator()(int a, int b)
  7. {
  8. return a < b;
  9. }
  10. };
  11. priority_queue<int, vector<int>, cmp>Q;
  12. int deg[maxn];
  13. vector<int>G[maxn];
  14. int main()
  15. {
  16. int n, r;
  17. int u, v;
  18. cin>>n>>r;
  19. for(int i=0; i<r; i++)
  20. {
  21. cin>>u>>v;
  22. G[u].push_back(v);
  23. deg[v]++;
  24. }
  25. for(int i=1; i<=n; i++)
  26. if(deg[i] == 0)
  27. {
  28. Q.push(i);
  29. }
  30. while(!Q.empty())
  31. {
  32. int t = Q.top();///因为使用优先队列 必须在与其相关节点入队之前将其pop这样不会因为优先性对于拓扑序有所影响
  33. ///换而言之,当入度为0时该节点已经是自由的,所有在这之前的节点已经得到安排,即拓扑序已经得到实现
  34. cout<<t<<" ";
  35. Q.pop();
  36. for(int i=0; i<G[t].size(); i++)
  37. {
  38. int &tmp = G[t][i];
  39. deg[tmp]--;
  40. if(!deg[tmp]) Q.push(tmp);
  41. }
  42. }
  43. return 0;
  44. }

你可能感兴趣的:(ACM)