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

 //这只是一个基本的框架,没有封装
#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类的实现的更多相关文章

  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. ubuntu以root身份登录

  2. CRC循环冗余检测C语言实现----花了几天时间乱写的

    由于笔者目前正在上计算机网络的课,老师要我们编一下crc的循环检测过程,所以我想着刚好在学c,那就随便看看写不写的了,首先百度了一下网上资料,基本都是用位移运算符实现的,由于本人懒得去看一下位移运算, ...

  3. Codeforces 1248C Ivan the Fool and the Probability Theory(推公式)

    题意 一个n*m的网格图,每个格子可以染黑色.白色,问你每个格子最多有一个相邻颜色相同的方案数 n,m<=1e5 思路 我们先处理\(1 \times m\)的情况 设\(f[i][j]\)为前 ...

  4. EMC NW NMM to backup MS AG

    To use EMC NW NMM to backup MS SQL always on database, that is a simple and safe way to protector da ...

  5. 题解 USACO12DEC【逃跑的BarnRunning Away From…】

    期末考前写题解,\(rp++! \ rp++! \ rp++!\) \[ description \] 给出一个以 \(1\) 为根的边带权有根树,给定一个参数 \(L\) ,问每个点的子树中与它距离 ...

  6. 基于 HTML5 WebGL 的智慧楼宇三维可视化监控

    前言 可视化的智慧楼宇在 21 世纪是有急迫需求的,中国被世界称为"基建狂魔",全球高层建筑数量位居首位,所以对于楼宇的监控是必不可少.智慧楼宇可视化系统更多突出的是管理方面的功能 ...

  7. VFP的数据策略:基础篇

    VFP的数据策略:基础篇 概述 在VFP应用程序中,有很多方法可以访问非VFP数据(如SQL Server):远程视图.SQ LPassthrough.ADO.XML……本文件将审查不同机制的利弊,并 ...

  8. maven mvn 安装介绍

    maven是什么? Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具 Maven 除了以程 ...

  9. golang-练习ATM --面向对象实现

    package utils import ( "fmt" "strings" ) type StructAtm struct { action int loop ...

  10. win10配置CUDA+Tensorflow2.0的一些经验

    目录 问题描述 安装 tensorflow-cpu-2.0 编译 Nvidia Samples 问题描述 网上已经很多关于配置CUDA的文章,自己这篇文章只是个大致的安装步骤,文章重点是安装和配置的一 ...