AOV拓扑排序实验-2-AOV类的实现
下面是这个类的实现代码:
- //这只是一个基本的框架,没有封装
- #include<iostream>
- #include<cstdio>
- #include<malloc.h>
- #include<cstring>
- #include<queue>
- #include<algorithm>
- using namespace std;
- struct point
- {
- int vertex;//顶点
- point* next;
- };
- class AOV
- {
- private:
- int* ok;
- int* indegree;//入度
- point* aim;//邻接表
- bool n_hasvalue;
- int n;
- public:
- int* ans;
- AOV(int maxn,int point_num);//构造函数原型
- AOV():AOV(,){};//直接构造函数
- AOV(int maxn);//容器型构造参数
- void maxpoint(int p);
- int readin();
- int* topo_sort();
- };
- void AOV::maxpoint(int p)
- {
- if(n_hasvalue==true)
- {
- printf("Sorry n had value,ERROR!\n");
- return;
- }
- n=p;
- n_hasvalue=true;
- return;
- }
- AOV::AOV(int maxn)//容器型构造参数
- {
- ans=new int[maxn];
- ok=(int*)new int[maxn];
- memset(ok,,sizeof(int)*maxn);
- //这里的重置不能写成sizeof(ok);这是最后的bug,查了好长时间
- indegree=new int[maxn];
- aim=new point[maxn];
- n_hasvalue=false;
- }
- //maxn是AOV容器的大小,point_num则是顶点数,分离是为了留一些重用的余地
- AOV::AOV(int maxn,int point_num)
- {//maxn描述可能使用到的最大的顶点数量
- ans=new int[maxn];
- ok=(int*)new int[maxn];
- memset(ok,,sizeof(int)*maxn);
- indegree=new int[maxn];
- aim=new point[maxn];
- n_hasvalue=true;
- n=point_num;
- }
- int AOV::readin()
- {
- if(n_hasvalue==false){printf("n do not has value!\n");return ;}
- memset(indegree,,sizeof(int)*(n+));
- for(int i=;i<n;i++)
- {
- aim[i].next=NULL;
- aim[i].vertex=i;
- }
- //初始化
- int a,b;//这里有说明具体的使用方法,可以将说明注释掉
- //printf("Please input pairs of numbers, which from 0 to n-1, to describe the relationship.\n");
- //printf("When there is a pair of numbers consists of two 0,then input will stop.\n");
- while(cin>>a>>b)
- {//a->b
- if(a==&&b==)break;//映射关系的结束标志是两个0
- if(a>=n||b>=n||a<||b<){printf("Data error\n");continue;}
- indegree[b]++;//入度加1
- point* temp=&aim[a];
- while(temp->next!=NULL)temp=temp->next;
- //找到存有指向结点链表的末端
- temp->next=(point*)malloc(sizeof(point));
- temp=temp->next;//进入新的point点
- temp->vertex=b;//a->b
- temp->next=NULL;
- }//完成邻接表的构建
- return ;
- }
- int* AOV::topo_sort()
- {
- // for(int i=0;i<n;i++)
- // {
- // printf("vertex %d indegree %d points to:",aim[i].vertex,indegree[i]);
- // point* temp=&aim[i];
- // while(temp->next!=NULL)
- // {
- // temp=temp->next;
- // printf("%d ",temp->vertex);
- // }
- // printf("\n");
- // }
- queue<int> psd;
- int cur=;
- int num=n;
- while()
- {
- if(num)
- {
- for(int i=;i<n;i++)
- {
- if(ok[i])continue;
- if(indegree[i]==)
- {
- psd.push(i);
- ok[i]=;
- num--;
- }
- }//检查所有入度0的顶点并入队,留下入队标记
- }
- if(psd.empty())break;//队列为空则排序结束
- int p=psd.front();psd.pop();
- point* temp=&aim[p];
- ans[cur++]=p;//也可以写成ans[cur++]=aim[i].vertex;
- //printf("%d ",p);
- //提出结点并排序
- while(temp->next!=NULL)
- {
- temp=temp->next;
- indegree[temp->vertex]--;
- }//去掉相关有向边
- }
- //printf("\n\ncur->%d\n",cur);
- return ans;
- }
- //下面是具体应用的代码
- int main()
- {
- freopen("input.txt","r",stdin);
- //freopen("ans.txt","w",stdout);
- int mp;
- cin>>mp;
- AOV cyc(,mp);
- cyc.readin();
- int* temp=cyc.topo_sort();
- for(int i=;i<mp;i++)
- {
- printf("%-3d",temp[i]);
- }
- return ;
- }
能力太低,不会写C++模板,所以只写了一个int型的类。可以考虑在以后的应用过程中采取映射的方式模拟非int型数据的排序。
其中input.txt中的输入信息是:
得到的运行结果是:
0 1 8 2 4 3 6 5 7 9 10
该类型的容错性还没有来得及加强,鲁棒性比较弱,只是个初级的实验代码,数据结构考虑进一步优化。
AOV拓扑排序实验-2-AOV类的实现的更多相关文章
- AOV拓扑排序实验总结-1
AOV拓扑排序实验总结-1 实验数据:1.实验输入数据在input.txt文件中2.对于n是指有顶点n个,数据的结束标志是一行0 0. 实验目的:获取优秀的AOV排序算法模板 数据结构安排 ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- 算法与数据结构(七) AOV网的拓扑排序(Swift版)
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- 有向无环图的应用—AOV网 和 拓扑排序
有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...
- AOV网络和Kahn算法拓扑排序
1.AOV与DAG 活动网络可以用来描述生产计划.施工过程.生产流程.程序流程等工程中各子工程的安排问题. 一般一个工程可以分成若干个子工程,这些子工程称为活动(Activity).完成了这些活动 ...
- 图的拓扑排序,AOV,完整实现,C++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- hdu 4324 Triangle LOVE(拓扑排序,基础)
题目 /***************************参考自****************************/ http://www.cnblogs.com/newpanderking ...
- AOV网与拓扑排序
在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex Network).AOV网中的弧表示活动 ...
- 拓扑排序---AOV图
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中全部顶点排成一个线性序列, 使得图中随意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出如 ...
随机推荐
- hive安装启动错误总结
错误一: Exception in thread "main" java.lang.NoClassDefFoundError: jline/console/completer/Ar ...
- 尝试用 Python 写了个病毒传播模拟程序
病毒扩散仿真程序,用 python 也可以. 概述 事情是这样的,B 站 UP 主 @ele 实验室,写了一个简单的疫情传播仿真程序,告诉大家在家待着的重要性,视频相信大家都看过了,并且 UP 主也放 ...
- Codeforces_832
A.判断n/k的奇偶性. #include<bits/stdc++.h> using namespace std; long long n,k; int main() { ios::syn ...
- Codeforces 924 A Tritonic Iridescence(暴力集合交集、相等)
题目链接:点击打开链接 There is a rectangular grid of n rows of m initially-white cells each. Arkady performed ...
- 【WPF学习】第四十四章 图画
通过上一章的学习,Geometry抽象类表示形状或路径.Drawing抽象类扮演了互补的角色,它表示2D图画(Drawing)——换句话说,它包含了显示矢量图像或位图需要的所有信息. 尽管有几类画图类 ...
- Go语言实现:【剑指offer】链表中倒数第k个结点
该题目来源于牛客网<剑指offer>专题. 输入一个链表,输出该链表中倒数第k个结点. Go语言实现: type ListNode struct { Val int Next *ListN ...
- SpingBoot错误信息处理及原理
SpringBoot错误信息处理机制 在一个web项目中,总需要对一些错误进行界面或者json数据返回,已实现更好的用户体验,SpringBoot中提供了对于错误处理的自动配置 ErrorMvcAut ...
- 渡一教育公开课重点笔记之css
主流浏览器及内核 浏览器 内核 IE trident Firefox Gecko Google chrome Webkit/blink(2014年上 ...
- Python3(七) 正则表达式与JSON
一. 初识正则表达式 1.定义:是一个特殊的字符序列,可以帮助检测一个字符串是否与我们所设定的字符序列相匹配. 2.作用:可以实现快速检索文本.实现替换文本的操作. 3.场景: 1.检测一串数字是否是 ...
- 前端工具配置(webpack 4、vue-cli 3)
随着前端项目复杂度的增加,其所依赖的资源也越来越多,从最初的HTML文件,CSS文件,JS文件发展到现在的各种预处理文件,模板文件等等.文件多了,项目大了,项目的维护就变得更加困难了,用户加载页面的速 ...