下面是这个类的实现代码:

  1. //这只是一个基本的框架,没有封装
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<malloc.h>
  5. #include<cstring>
  6. #include<queue>
  7. #include<algorithm>
  8. using namespace std;
  9. struct point
  10. {
  11. int vertex;//顶点
  12. point* next;
  13. };
  14.  
  15. class AOV
  16. {
  17. private:
  18. int* ok;
  19. int* indegree;//入度
  20. point* aim;//邻接表
  21. bool n_hasvalue;
  22. int n;
  23.  
  24. public:
  25. int* ans;
  26. AOV(int maxn,int point_num);//构造函数原型
  27. AOV():AOV(,){};//直接构造函数
  28. AOV(int maxn);//容器型构造参数
  29. void maxpoint(int p);
  30. int readin();
  31. int* topo_sort();
  32. };
  33.  
  34. void AOV::maxpoint(int p)
  35. {
  36. if(n_hasvalue==true)
  37. {
  38. printf("Sorry n had value,ERROR!\n");
  39. return;
  40. }
  41. n=p;
  42. n_hasvalue=true;
  43. return;
  44. }
  45.  
  46. AOV::AOV(int maxn)//容器型构造参数
  47. {
  48. ans=new int[maxn];
  49. ok=(int*)new int[maxn];
  50. memset(ok,,sizeof(int)*maxn);
  51. //这里的重置不能写成sizeof(ok);这是最后的bug,查了好长时间
  52. indegree=new int[maxn];
  53. aim=new point[maxn];
  54. n_hasvalue=false;
  55. }
  56. //maxn是AOV容器的大小,point_num则是顶点数,分离是为了留一些重用的余地
  57. AOV::AOV(int maxn,int point_num)
  58. {//maxn描述可能使用到的最大的顶点数量
  59. ans=new int[maxn];
  60. ok=(int*)new int[maxn];
  61. memset(ok,,sizeof(int)*maxn);
  62. indegree=new int[maxn];
  63. aim=new point[maxn];
  64. n_hasvalue=true;
  65. n=point_num;
  66. }
  67.  
  68. int AOV::readin()
  69. {
  70. if(n_hasvalue==false){printf("n do not has value!\n");return ;}
  71. memset(indegree,,sizeof(int)*(n+));
  72. for(int i=;i<n;i++)
  73. {
  74. aim[i].next=NULL;
  75. aim[i].vertex=i;
  76. }
  77. //初始化
  78. int a,b;//这里有说明具体的使用方法,可以将说明注释掉
  79. //printf("Please input pairs of numbers, which from 0 to n-1, to describe the relationship.\n");
  80. //printf("When there is a pair of numbers consists of two 0,then input will stop.\n");
  81. while(cin>>a>>b)
  82. {//a->b
  83. if(a==&&b==)break;//映射关系的结束标志是两个0
  84. if(a>=n||b>=n||a<||b<){printf("Data error\n");continue;}
  85. indegree[b]++;//入度加1
  86. point* temp=&aim[a];
  87. while(temp->next!=NULL)temp=temp->next;
  88. //找到存有指向结点链表的末端
  89. temp->next=(point*)malloc(sizeof(point));
  90. temp=temp->next;//进入新的point点
  91. temp->vertex=b;//a->b
  92. temp->next=NULL;
  93. }//完成邻接表的构建
  94. return ;
  95. }
  96.  
  97. int* AOV::topo_sort()
  98. {
  99. // for(int i=0;i<n;i++)
  100. // {
  101. // printf("vertex %d indegree %d points to:",aim[i].vertex,indegree[i]);
  102. // point* temp=&aim[i];
  103. // while(temp->next!=NULL)
  104. // {
  105. // temp=temp->next;
  106. // printf("%d ",temp->vertex);
  107. // }
  108. // printf("\n");
  109. // }
  110. queue<int> psd;
  111. int cur=;
  112. int num=n;
  113. while()
  114. {
  115. if(num)
  116. {
  117. for(int i=;i<n;i++)
  118. {
  119. if(ok[i])continue;
  120. if(indegree[i]==)
  121. {
  122. psd.push(i);
  123. ok[i]=;
  124. num--;
  125. }
  126. }//检查所有入度0的顶点并入队,留下入队标记
  127. }
  128. if(psd.empty())break;//队列为空则排序结束
  129. int p=psd.front();psd.pop();
  130. point* temp=&aim[p];
  131. ans[cur++]=p;//也可以写成ans[cur++]=aim[i].vertex;
  132. //printf("%d ",p);
  133. //提出结点并排序
  134. while(temp->next!=NULL)
  135. {
  136. temp=temp->next;
  137. indegree[temp->vertex]--;
  138. }//去掉相关有向边
  139. }
  140. //printf("\n\ncur->%d\n",cur);
  141. return ans;
  142. }
  143. //下面是具体应用的代码
  144. int main()
  145. {
  146. freopen("input.txt","r",stdin);
  147. //freopen("ans.txt","w",stdout);
  148. int mp;
  149. cin>>mp;
  150. AOV cyc(,mp);
  151. cyc.readin();
  152. int* temp=cyc.topo_sort();
  153. for(int i=;i<mp;i++)
  154. {
  155. printf("%-3d",temp[i]);
  156. }
  157. return ;
  158. }

能力太低,不会写C++模板,所以只写了一个int型的类。可以考虑在以后的应用过程中采取映射的方式模拟非int型数据的排序。

其中input.txt中的输入信息是:

  1.  

得到的运行结果是:

0  1  8  2  4  3  6  5  7  9  10

该类型的容错性还没有来得及加强,鲁棒性比较弱,只是个初级的实验代码,数据结构考虑进一步优化。

AOV拓扑排序实验-2-AOV类的实现的更多相关文章

  1. AOV拓扑排序实验总结-1

    AOV拓扑排序实验总结-1   实验数据:1.实验输入数据在input.txt文件中2.对于n是指有顶点n个,数据的结束标志是一行0 0.   实验目的:获取优秀的AOV排序算法模板   数据结构安排 ...

  2. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  3. 算法与数据结构(七) AOV网的拓扑排序(Swift版)

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  4. 有向无环图的应用—AOV网 和 拓扑排序

    有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...

  5. AOV网络和Kahn算法拓扑排序

    1.AOV与DAG 活动网络可以用来描述生产计划.施工过程.生产流程.程序流程等工程中各子工程的安排问题.   一般一个工程可以分成若干个子工程,这些子工程称为活动(Activity).完成了这些活动 ...

  6. 图的拓扑排序,AOV,完整实现,C++描述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  7. hdu 4324 Triangle LOVE(拓扑排序,基础)

    题目 /***************************参考自****************************/ http://www.cnblogs.com/newpanderking ...

  8. AOV网与拓扑排序

    在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex Network).AOV网中的弧表示活动 ...

  9. 拓扑排序---AOV图

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中全部顶点排成一个线性序列, 使得图中随意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出如 ...

随机推荐

  1. hive安装启动错误总结

    错误一: Exception in thread "main" java.lang.NoClassDefFoundError: jline/console/completer/Ar ...

  2. 尝试用 Python 写了个病毒传播模拟程序

    病毒扩散仿真程序,用 python 也可以. 概述 事情是这样的,B 站 UP 主 @ele 实验室,写了一个简单的疫情传播仿真程序,告诉大家在家待着的重要性,视频相信大家都看过了,并且 UP 主也放 ...

  3. Codeforces_832

    A.判断n/k的奇偶性. #include<bits/stdc++.h> using namespace std; long long n,k; int main() { ios::syn ...

  4. Codeforces 924 A Tritonic Iridescence(暴力集合交集、相等)

    题目链接:点击打开链接 There is a rectangular grid of n rows of m initially-white cells each. Arkady performed ...

  5. 【WPF学习】第四十四章 图画

    通过上一章的学习,Geometry抽象类表示形状或路径.Drawing抽象类扮演了互补的角色,它表示2D图画(Drawing)——换句话说,它包含了显示矢量图像或位图需要的所有信息. 尽管有几类画图类 ...

  6. Go语言实现:【剑指offer】链表中倒数第k个结点

    该题目来源于牛客网<剑指offer>专题. 输入一个链表,输出该链表中倒数第k个结点. Go语言实现: type ListNode struct { Val int Next *ListN ...

  7. SpingBoot错误信息处理及原理

    SpringBoot错误信息处理机制 在一个web项目中,总需要对一些错误进行界面或者json数据返回,已实现更好的用户体验,SpringBoot中提供了对于错误处理的自动配置 ErrorMvcAut ...

  8. 渡一教育公开课重点笔记之css

    主流浏览器及内核 浏览器         内核 IE             trident Firefox    Gecko Google chrome    Webkit/blink(2014年上 ...

  9. Python3(七) 正则表达式与JSON

    一. 初识正则表达式 1.定义:是一个特殊的字符序列,可以帮助检测一个字符串是否与我们所设定的字符序列相匹配. 2.作用:可以实现快速检索文本.实现替换文本的操作. 3.场景: 1.检测一串数字是否是 ...

  10. 前端工具配置(webpack 4、vue-cli 3)

    随着前端项目复杂度的增加,其所依赖的资源也越来越多,从最初的HTML文件,CSS文件,JS文件发展到现在的各种预处理文件,模板文件等等.文件多了,项目大了,项目的维护就变得更加困难了,用户加载页面的速 ...