拓扑排序(二)

作者:追风剑情 发布于:2014-11-16 14:50 分类:Algorithms

     拓扑排序是有向图的一种重要运算。设G=(V,E)是一个具有n个顶点的有向图,在图中顶点表示活动,用边表示活动间的优先关系,则这个有向图称为用顶点表示活动的网(Activity On Vertex Network),简称为AOV网。在AOV网中,如果从顶点Vi到顶点Vj有一条有向路径,则Vi是Vj的前驱,Vj是Vi的后继;如果<Vi,Vj>是AOV网中的一条边,则Vi是Vj的直接前驱,Vj是Vi的直接后继。

     对于一个AOV网,构造其所有顶点的线性序列,建立顶点之间的先后关系,而且使原来没有先后关系的顶点之间也建立起人为的先后关系,这样的线性序列称为拓扑有序序列。构造AOV网的拓扑有序序列的运算称为拓扑排序

工发工具 Visual Studio 2010

工发语言 C++

StructInfo.h文件


  1. #define MAXV 7 //最大顶点数
  2.  
  3. //顶点
  4. typedef struct vertex
  5. {
  6. int adjvex; /*顶点编号*/
  7. } Vertex;
  8.  
  9. //边
  10. typedef struct edgenode
  11. {
  12. int adjvex; //顶点序号
  13. int value; //边的权值
  14. struct edgenode *next; //下一条边的顶点
  15. } ArcNode;
  16.  
  17. //表头结点类型
  18. typedef struct
  19. {
  20. Vertex data; //顶点信息
  21. int count; //存放顶点入度
  22. ArcNode *firstarc; //指向第一条边
  23. } VNode;


MainApp.cpp文件


  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "StructInfo.h"
  5.  
  6.  
  7. /**
  8. * 拓扑排序
  9. * 任何无环路的有向图,其所有顶点都可以排在一个拓扑有序序列中。
  10. * 一个AOV网的拓扑有序序列并不是唯一的。
  11. * 排序方法:
  12. * (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它。
  13. * (2)从网中删去该顶点,并且删去从该顶点发出的全部有向边。
  14. * (3)重复上述两步,直到剩余的网中不再存在没有前驱的顶点为止。
  15. */
  16. void TopSort(VNode adj[], int n){
  17. int i,j;
  18. int St[MAXV], top=-1;//栈St的指针为top
  19. ArcNode *p;
  20. for (i=0; i<n; i++){
  21. //入度为0的顶点入栈
  22. if (adj[i].count == 0){
  23. top++;
  24. St[top] = i;
  25. }
  26.  
  27. //栈不为空时循环
  28. while(top > -1){
  29. i = St[top]; top--;//出栈
  30. printf("%d ", i);//输出顶点
  31. p = adj[i].firstarc;//找第1个相邻顶点
  32. while (p != NULL){
  33. j = p->adjvex;
  34. adj[j].count--;
  35. //入度为0的相邻顶点入栈
  36. if(adj[j].count == 0){
  37. top++;
  38. St[top] = j;
  39. }
  40. p=p->next;//找下一个相邻顶点
  41. }
  42. }
  43. }
  44. }
  45.  
  46. void main()
  47. {
  48.  
  49. }


标签: Algorithms

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号