拓扑排序

简介: 拓扑排序

拓扑排序是针对有向无环图的,当然也可以用它来检测到底有没有环,数据结构中学过其构成原理,这里就不再赘述,主要来讲他的实现。

分析原理,其实他的过程有点类似于层次遍历,所以用队列存储入度为0的点是OK的,但其实只要每次入队的结点入度为0,也没有顺序要求,栈也行,这里我为了避免每次比较麻烦,直接用优先队列实现。


#include<iostream> 
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int G[51][51];
int indegree[51]={0};
int num[51];//存储拓扑排序顺序
struct cmp{
  bool operator()(const int a,const int b)const{
  return indegree[a]>indegree[b];}
};
bool topologicalsort(int n){
  priority_queue<int,vector<int>,cmp>q; 
  //优先队列存储入度下标,按从小到大排序
  for(int i=1;i<=n;i++)//全部入队
  q.push(i);
  int i=1;
  while(!q.empty()){ //只要队空,拓扑完成
    int t=q.top();q.pop();
    if(indegree[t]!=0)//队首元素入度不为0,失败
    return false;
    num[i++]=t;
    for(int j=1;j<=n;j++) 
    if(G[t][j]!=0)
    indegree[j]--;
  }
   return true;
}
int main(){
  int n,x;
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
  for(int j=1;j<=n;j++)
  {
    scanf("%d",&x);
    G[i][j]=x;
    if(x!=0)indegree[j]++;
  }
  if(topologicalsort(n)){
    for(int i=1;i<=n;i++)
    printf("%d ",num[i]-1) ;
    printf("\n");
  }
  else printf("ERROR");
  return 0;
}

而用栈实现拓扑排序有一个好处,其元素的输出恰好是逆拓扑排序,在求关键路径时有用,下面是其代码。

stack<int>s;//存储拓扑排序,逆向输出为逆拓扑排序
bool topological(int n) {
  queue<int>q;
  for(int i=1;i<=n;i++) 
  if(indegree[i]==0)
  q.push(i);
  while(!q.empty()){
    int t=q.front();q.pop();
      s.push(t);
      for(int i=0;i<Adj[t].size();i++){
        int x=Adj[t][i].v,w=Adj[t][i].w;
        indegree[x]--;
        if(indegree[x]==0)
        q.push(x);
    }
  }
  if(s.size()==n)return true;
  return false;
}
相关文章
|
存储 缓存 算法
数据结构-链表(一)
链表(Linked List)是一种常见的数据结构,用于存储和组织数据。与数组不同,链表的元素(节点)在内存中不必连续存储,而是通过指针链接在一起。 链表由多个节点组成,每个节点包含两部分:数据(存储实际的元素值)和指针(指向下一个节点的引用)。链表的第一个节点称为头节点,最后一个节点称为尾节点,尾节点的指针通常指向空值(null)。
400 1
网络基础之三
网络基础之三
321 0
【计算机网络】第三章 数据链路层(可靠传输)
【计算机网络】第三章 数据链路层(可靠传输)
|
运维 网络协议
IP 地址类别:权威指南
IP 地址类别:权威指南
2206 4
|
算法
串ababaaababaa的next和串ababaabab的nextval
本文介绍了计算字符串的next数组和nextval数组的方法,通过分析两个具体的例子来展示如何计算这些数组,这些数组通常用于KMP算法中。
885 0
串ababaaababaa的next和串ababaabab的nextval
|
存储 网络协议 网络性能优化
一文详细理解计算机网络体系结构(考试和面试必备)
这篇文章提供了C++基础知识的快速概述,包括C++的特点、面向对象设计、组成部分、标准、学习建议、应用领域、源文件、编译器、类与对象、编译执行步骤、分号与块、标识符、基本数据类型、typedef、枚举类型、变量定义与声明等。
620 0
一文详细理解计算机网络体系结构(考试和面试必备)
|
调度 数据安全/隐私保护
用户态和内核态 中断处理机制
用户态和内核态 中断处理机制
840 0
|
存储 缓存 算法
OS—设备独立性软件
OS—设备独立性软件
646 0
|
缓存 算法 内存技术
计算机组成原理(4)-----Cache的原理及相关知识点(2)
计算机组成原理(4)-----Cache的原理及相关知识点
486 1
|
传感器 C++
计算机网络:数据链路层之差错控制、奇偶校验码、CRC循环冗余码、海明码
计算机网络:数据链路层之差错控制、奇偶校验码、CRC循环冗余码、海明码
869 0