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在线性序列中出如 ...
随机推荐
- Ceph 存储集群-低级运维
低级集群运维包括启动.停止.重启集群内的某个具体守护进程:更改某守护进程或子系统配置:增加或拆除守护进程.低级运维还经常遇到扩展.缩减 Ceph 集群,以及更换老旧.或损坏的硬件. 一.增加/删除 O ...
- CCF_ 201409-2_画图
将一个数组比作画板,有颜色的位置标1,统计即可. #include<cstdio> #include<iostream> #define NUM 100 using names ...
- HDU_2571_DP
http://acm.hdu.edu.cn/showproblem.php?pid=2571 简单dp,从上到下,从左到右依次更新每一格的最大幸运值. #include<iostream> ...
- Codeforces Round #617 (Div. 3) D. Fight with Monsters
D : Fight with Monsters 题目大意 : 有一组数,每个值对应着一个怪物的 hp 值,现在有两个人,一个自己一个对手,每个人有一个攻击值, 两个人轮流攻击怪物,如果是自己将怪物先打 ...
- JMeter接口测试-接口签名校验
前言 很多HTTP接口在传参时,需要先对接口的参数进行数据签名加密 如pinter项目的中的签名接口 http://localhost:8080/pinter/com/userInfo 参数为: {& ...
- 20191223-python学习第三天
1.运算符补充 (1)in 与 not in 学习 (2)优先级 >小于 ,<小于,计算运算关系优先级 > not > and > or 2.charm自动生成文件头部 ...
- k8s系列---Worker节点扩容
其他有关内容 安装:参考https://www.cnblogs.com/dribs/p/9082458.html 集群故障重置:参考https://www.cnblogs.com/dribs/p/10 ...
- tomcat增加内存 JVM内存调优
tomcat总是卡死,查看日志catalina.out 发现疯狂报错 如下,提示内存溢出 java.lang.OutOfMemoryError: Java heap space 此外常见的内存溢出有以 ...
- ubuntu16.04 自建源
来自于https://www.cnblogs.com/liangqihui/p/7150066.html APT本地源的搭建(可用于局域网apt-get源搭建或者本地源) 本文档介绍使用apt-mir ...
- Vue与React的区别
对已经了解的内容,做几点介绍,并不全面,后期会不断更新~ React与Vue都是组件化的开发框架,整体功能类似. 一.数据处理模式(单项 or 双向): React推崇单项数据流的处理模式,数据不可以 ...