AOV拓扑排序实验总结-1
 
实验数据:
1、实验输入数据在input.txt文件中
2、对于n是指有顶点n个,数据的结束标志是一行0 0。
 
实验目的:获取优秀的AOV排序算法模板
 
数据结构安排:
1、队列:负责记录入度为0且没有排序的AOV顶点
2、邻接表结点:邻接表结点采用自定义的复合结构,保存顶点信息、边表头指针。
3、邻接表边表:采取链表的形式存储数据
4、邻接表的数据类型是相同的,只是在概念上使得结点独特的保存了当前起始顶点
5、按照vertex的编号独立的使用一个数组indegree保存入度,一定程度的节省了空间
 
实验内容:1、算法模板的设计 2、算法类的设计或头文件封装的尝试
 
AOV算法模板要求:
1、假定AOV排序成立
2、vertex本身可以按照编号进行命名
 
构建的邻接表展现:
代码如下:
 for(int i=;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");
}
展示情况:
vertex 0 indegree 0 points to:8 2
vertex 1 indegree 0 points to:2 4
vertex 2 indegree 2 points to:3
vertex 3 indegree 2 points to:5 7 9 10
vertex 4 indegree 1 points to:6
vertex 5 indegree 1 points to:
vertex 6 indegree 1 points to:10
vertex 7 indegree 1 points to:
vertex 8 indegree 1 points to:9 3
vertex 9 indegree 2 points to:
vertex 10 indegree 2 points to:
总体模板运行结果:
  0  1  8  2  4  3  6  5  7  9 10
运行正常
 
实验代码:
 //算法模板的设计
#include<iostream>
#include<cstdio>
#include<malloc.h>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = ;
struct point
{
int vertex;//顶点
point* next;
}; int indegree[maxn];
point aim[maxn];
int n; int readin()
{
scanf("%d",&n);
memset(indegree,,sizeof(int)*n);
for(int i=;i<n;i++)
{
aim[i].next=NULL;
aim[i].vertex=i;
}
//初始化
int a,b;
while(scanf("%d%d",&a,&b))
{//a->b
if(a==&&b==)break;
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 ;
} queue<int> psd;
int topo_sort(int* ans)
{
bool ok[maxn];
memset(ok,false,sizeof(ok));
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]=true;
num--;
}
}//检查所有入度0的顶点并入队,留下入队标记
}
if(psd.empty())break;//队列为空则排序结束
int p=psd.front();psd.pop();
point* temp=&aim[p];
ans[cur++]=p;//也可以写成ans[cur++]=aim[i].vertex;
//提出结点并排序
while(temp->next!=NULL)
{
temp=temp->next;
indegree[temp->vertex]--;
}//去掉相关有向边
}
return ;
} int ans[maxn];
int main()
{
//freopen("input.txt","r",stdin);
//freopen("ans.txt","w",stdout);
readin();
topo_sort(ans);
for(int i=;i<n;i++)
{
printf("%3d",ans[i]);
}
printf("\n");
return ;
}

AOV拓扑排序实验总结-1的更多相关文章

  1. AOV拓扑排序实验-2-AOV类的实现

    下面是这个类的实现代码: //这只是一个基本的框架,没有封装 #include<iostream> #include<cstdio> #include<malloc.h& ...

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

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

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

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

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

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

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

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

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

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

  7. AOV网与拓扑排序

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

  8. 拓扑排序---AOV图

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

  9. 【algo&ds】9.拓扑排序、AOV&AOE、关键路径问题

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

随机推荐

  1. 学习记录(Python列表)

    列表(List)是Python语言中最通用的序列数据结构之一,列表是一个没有固定长度的,用来表示任意类型对象的位置相关的有序集合.列表中的数据项不需要具有相同的数据类型 列表的基本操作: 1.创建列表 ...

  2. C++ 类模板详解(一):概念和基本使用方式

    与函数模板类似地(C++函数模板详解(一):概念和特性) ,类也可以被一种或多种类型参数化.例如,容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素.只要使用类模板,我们就可以实 ...

  3. 【原创】在 ASP.NET Core 3.1 中使用 Senparc.Weixin.Work 企业微信 SDK —— 发送文本消息

    下面在 Web 空应用里展示一个简单的例子来实现发送文本消息. 本文目录: 创建 Web 空应用 命令行方式创建 添加SDK引用 命令行方式 进入项目目录 添加包引用 配置和使用SDK 添加appse ...

  4. ORALCE逻辑存储结构

    ORACLE逻辑存储结构块: 数据块 他是最基础的逻辑存储单元,数据以行的形式存储到我么的数据块中 区 :多个块的集合 并且区组成了物理的数据文件 段 :(表 索引 物化视图 物化视图日志 大对象 大 ...

  5. ROS和Gazebo进行机器人仿真(二)

    一.在Gazebo中使用ROS控制器 在本节中,我们将讨论如何在Gazebo中让机器人的每个关节运动. 为了让关节动起来,我们需要分配一个ROS控制器,尤其是,我们需要为每个关节连上一个与transm ...

  6. Java数据类型及对应取值范围

    Java数据类型及对应取值范围 在Java中,数据类型分为两大种:基本数据类型(值类型)和包装类型(引用数据类型).基本数据类型不是对象,不能调用toString().hashCode().getCl ...

  7. 1276:【例9.20】P2758 编辑距离

    题目传送门[(https://www.luogu.com.cn/problem/P2758)] 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作 ...

  8. linux下安装php的svn模块

    在php下为了方便使用svn命令,还是安装下php的svn扩展 首先确保机器上已经有lamp或lnmp环境,然后 >yum install subversion subversion-devel ...

  9. Method Resolve Order (MRO) - 类对象属性的解析顺序

    Method Resolve Order (MRO) - 类对象属性的解析顺序 Python 支持多重继承, 此时就需要解决按照何种顺序来解析属性的问题.类的继承关系在一个特殊的类属性中指定(__mr ...

  10. Java类的加载过程与ClassLoader的理解及测试

    当程序准备运行某个类,但该类还未被加载到内存中时,会经过以下三个步骤进行类的加载: 类的加载(Load)→类的连接(Link)→类的初始化(Initialize) 加载:类经过javac.exe编译的 ...