拓扑排序

 

拓扑排序

求助编辑百科名片
拓扑排序   
拓扑排序

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。

目录

拓扑排序(Topological Sort)
  1. 什么是拓扑序列
  2. 举例
  3. 实现的基本方法
在计算机语言中的应用
  1. 拓扑序列 Pascal代码:
  2. 拓扑序列 C++核心代码
  3. 延伸 拓扑学
展开

编辑本段拓扑排序(Topological Sort)

什么是拓扑序列

  通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。离散数学中关于偏序和全序的定义:
  若集合X上的关系是R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。
  设R是集合X上的偏序(Partial Order),如果对每个x,y属于X必有xRy 或 yRx,则称R是集合X上的全序关系。
  注意:
  ①若将图中顶点按拓扑次序排成一行,则图中所有的有向边均是从左指向右的。
  ②若图中存在有向环,则不可能使顶点满足拓扑次序。
  ③一个DAG的拓扑序列通常表示某种方案切实可行。

举例

  【例】对如上学生选课工程图进行拓扑排序, 得到的拓扑有序序列为
  C1 , C2 , C3 , C4 , C5 , C6 , C8 , C9 , C7
  或 C1 , C8 , C9 , C2 , C5 , C3 , C4 , C7 , C6
  【例】一本书的作者将书本中的各章节学习作为顶点,各章节的先学后修关系作为边,构成一个有向图。按有向图的拓扑次序安排章节,才能保证读者在学习某章节时,其预备知识已在前面的章节里介绍过。
  ④一个DAG可能有多个拓扑序列。

实现的基本方法

   拓扑排序方法如下:
  (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
  (2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
  (3)重复上述两步,直到剩余的网中不再存在没有前驱的顶点为止.

编辑本段在计算机语言中的应用

拓扑序列 Pascal代码:

  program TopSort;
  var
  map,link:array [1..100,1..100] of integer;
  v,pnt:array [1..100] of integer;
  n,m,a,b,i,j,k:integer;
  begin
  fillchar(map,sizeof(map),0);
  fillchar(link,sizeof(link),0);
  fillchar(v,sizeof(v),0);
  readln(n,m);
  for i:=1 to m do
  begin
  readln(a,b);
  map[a,b]:=1;
  v[b]:=v[b]+1;
  end;
  i:=0;
  link:=map;
  while (i<n) do
  begin
  j:=1;
  while (v[j]<>0) do inc(j);
  v[j]:=-1;
  for k:=1 to n do
  if link[j,k]=1 then begin dec(v[k]);link[j,k]:=0; end;
  inc(i);
  pnt[i]:=j;
  end;
  for i:=1 to n do
  writeln(pnt[i]);
  end.

拓扑序列 C++核心代码

  bool TopologicalSort(int a[][101]) //可以完成拓扑排序则返回True
  {
  int n = a[0][0], i, j;
  int into[101], ans[101];
  memset(into, 0, sizeof(into));
  memset(ans, 0, sizeof(ans));
  for (i = 1; i <= n; i++)
  {
  for (j = 1; j <= n; j++)
  {
  if (a[i][j] > 0)
  into[j]++;
  }
  }
  into[0] = 1;
  for (i = 1; i <= n; i++)
  {
  j = 0;
  while (into[j] != 0)
  {
  j++;
  if (j > n)
  return false;
  }
  ans[i] = j;
  into[j] = -1;
  for (int k = 1; k <= n; k++)
  {
  if (a[j][k] > 0)
  into[k]--;
  }
  }
  for (i = 1; i <= n; i++)
  {
  cout << ans[i] << " ";
  }
  cout << endl;
  return true;
  }

延伸 拓扑学

   拓扑学是近代发展起来的一个研究连续性现象的数学分支。中文名称起源于希腊语Τοπολογία的音译。Topology原意为地貌,于19世纪中期由科学家引入,当时主要研究的是出于 数学分析的需要而产生的一些几何问题。发展至今,拓扑学主要研究拓扑空间在拓扑变换下的不变性质和不变量。
开放分类:
算法图论

百度百科中的词条内容仅供参考,如果您需要解决具体问题(尤其在法律、医学等领域),建议您咨询相关领域专业人士。

551 本词条对我有帮助
合作编辑者
更多
如果您认为本词条还需进一步完善,百科欢迎您也来参与 编辑词条在开始编辑前,您还可以先学习 如何编辑词条

如想投诉,请到百度百科投诉中心;如想提出意见、建议,请到百度百科吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值