AOV网络

用顶点表示活动的网络
用有向图表示先修和后修的关系。

在有向图中,用顶点表示活动,

用有向边< vi, vj >表示vi 必须先于 v j进行。

如果有有向环则说明某项活动以自己为先决条件,这是不对的。


图中明显没有环。
可以看到输出的顺序。

排序(这里不是按大小排)

例如: 课程应该先修哪一个门课。比如数据结构这门课的先修课是C++语言高等数学。

这样按照顺序排序然后输出,就可以知道怎么修读课程。

上图的修读顺序是F 、D、 C、A 、 B

步骤如下:

  1. 输入AOV网络,
  2. 在有向图中选一个入度为0 的点,删除并输出
  3. 从图中删去该顶点,以及相关联的边。
    循环做

直到全部输出,
或者有环,终止。

这里用栈做辅助结构,用栈存所有入度为0 的结点。

template<class T, class E>
void Graph<T, E>::sort()
{int i = 0 ,j=0, m=0;Edge<T,E>* p = 0;Stack<int> s;for (i = 0; i < numVertices; i++){if (count[i] == 0){s.Push(i);}}while (!s.Isempty()){s.Pop(i);cout << " 顶点 : " << getVertexvalue(i) << endl;m++;p = NodeTable[i].adj;while (p != 0){count[p->dest]--;if (count[p->dest] == 0) s.Push(p->dest);//退出循环时要输出该点p = p->link;}}if (m < numVertices){cout << "图有回路 " << endl;}
}

以下是算法结果:

完整图代码:

#include<iostream>
#include "Minheap.h"//自己建的
#include"Queue.h"//自己建的
#include"stack.h"//自己建的
using namespace std;//图的邻接表结构(有向图)
const int DefaultVertices = 30;//默认最大顶点数
//边结点,下一个顶点的位置
template<class T, class E>//T为顶点名字
struct Edge {int dest;     //边的另一个顶点的位置E cost;     //边上的权值Edge<T, E>* link;            //这个点的下一条边Edge() { dest = -1; cost = 0; link = NULL; }Edge(int num, E weight) { dest = num; cost = weight; link = NULL; }
};//顶点
template<class T, class E>//T为数据
struct Vertex {T data;                  //顶点名字Edge<T, E>* adj;           //边链表的头指针Vertex() {};//friend istream& operator >>(istream& in, Vertex<T, E>& V);friend ostream& operator <<(ostream& out, Vertex<T, E>& V);
};template <class T, class E>
ostream& operator <<(ostream& out, Vertex<T, E>& V)
{out << V.data<<endl;
}
//图
template<class T, class E>         //T为顶点名字
class Graph
{public:int maxVertices;               //图中最大顶点数int numEdges;                 //当前边数int numVertices;              //当前顶点数bool* visited;                // 成员属性 辅助数组Vertex<T, E>* NodeTable;       //顶点表(各边链表的头指针)Graph(int sz);~Graph();int* count;//记录每一个顶点的入度数 的 数组int getVertexPos(T vetrex) {//给出顶点vetrex在图中的位置,可以改成散列的方式for (int i = 0; i < numVertices; i++) {if (NodeTable[i].data == Vertex)return i;}return -1;}T getVertexvalue(int x) {return  NodeTable[x].data;}void CreateNodeTable();void dfs(){int i = 0, v0 = 0;for (i = 0; i < numVertices; i++)visited[i] = false;cout << "输入深度优先遍历的出发点" << endl;cin >> v0;DFS(v0);}void DFS(int v);void BFS();void sort();   //拓扑排序
};template<class T, class E>
Graph<T, E>::Graph(int sz) {//初始化maxVertices = sz; numVertices = 0; numEdges = 0;NodeTable = new Vertex<T, E>[maxVertices];//创建顶点表数组visited = new bool[sz];int i=0;cout << " 请输入结点数 :" << endl;cin >> numVertices;count = new int[numVertices];//初始化为0for (i = 0; i < numVertices; i++){count[i] = 0;}if (NodeTable == NULL || visited == NULL){cerr << "存储分配错误!" << endl;exit(0);}for (i = 0; i < maxVertices; i++) {NodeTable[i].adj = NULL;//边链表头指针赋空}for (i = 0; i < numVertices; i++){visited[i] = false;}CreateNodeTable();
}template<class T, class E>
Graph<T, E>::~Graph() {Edge<T, E>* p;for (int i = 0; i < numVertices; i++){p = NodeTable[i].adj; //保留头结点while (p != 0){NodeTable[i].adj = p->link;delete p;p = NodeTable[i].adj;}}
}template<class T, class E>
void Graph<T, E>::CreateNodeTable()
{int  j = 0, i = 0, m = 0;Edge<T, E>* p;for (i = 0; i < numVertices; i++){NodeTable[i].adj = 0;cout << "输入结点 :" << endl;cin >> NodeTable[i].data;cout << "输入以它为起点的边数 : " << endl;cin >> m; //建立的链表的长度for (j = 0; j < m; j++){p = new Edge<T, E>;cout << "输入终点的 数组 下标号 : " << endl;cin >> p->dest;  //输入连接点的数组下标号//入度数count[p->dest]++;//建链p->link = NodeTable[i].adj;NodeTable[i].adj = p;}}
}//遍历递归,需要参数v的
//DFS=====类似前序遍历,就可以看成前序遍历(根左右)
template<class T, class E>
void Graph<T, E>::DFS(int v)                   //v表示起点
{Edge<T, E>* p;visited[v] = true;cout << NodeTable[v].data << " -> ";p = NodeTable[v].adj;while (p != 0){if (!visited[p->dest])DFS(p->dest);//先把一个点的路走到头, 再找其他点作为起点p = p->link;}
}//BFS====层次遍历(队列作为辅助结构)
//不需要初始值
template<class T, class E>
void Graph<T, E>::BFS()
{for (int i = 0; i < numVertices; i++)visited[i] = false;int v = 0;  //根结点的下标Edge<T, E>* p;SeqQueue<int> qu;//定义一个队列cout << "输入一个出发点的位置:" << endl;cin >> v; qu.EnQueue(v);visited[v] = true; //这里表示入列while (!qu.IsEmpty()){v = qu.getFront(v); //取队头元素qu.DeQueue(v);      //弹出队头元素if (!visited[v]){cout << NodeTable[v].data << " -> ";visited[v] = true;}p = NodeTable[v].adj;//找邻接点while (p != 0){if (!visited[p->dest])qu.EnQueue(p->dest);p = p->link;}}
}template<class T, class E>
void Graph<T, E>::sort()
{int i = 0 ,j=0, m=0;Edge<T,E>* p = 0;Stack<int> s;for (i = 0; i < numVertices; i++){if (count[i] == 0){s.Push(i);}}while (!s.Isempty()){s.Pop(i);cout << " 顶点 : " << getVertexvalue(i) << endl;m++;p = NodeTable[i].adj;while (p != 0){count[p->dest]--;if (count[p->dest] == 0) s.Push(p->dest);p = p->link;}}if (m < numVertices){cout << "图有回路 " << endl;}
}

AOV网络(有向图)----拓扑排序--判断有无环的问题--12月18日相关推荐

  1. 图算法入门3:活动网络-AOV网络和拓扑排序

    AOV网络 通常一个工程可以分成若干个子工程,这些子工程被称为活动(activity),完成这些活动,整个工程就完成了.给一个简单的例子,如下图,大学专业课程存在依赖关系,对于一些课程必须选修其他课程 ...

  2. 图论——AOV网络及拓扑排序

    引入 有向无环图(DAG) 如果一个有向图不存在环,也就是任意结点都无法通过一些有向边回到自身,那么称这个有向图为有向无环图 AOV 网络 在有向图中,用顶点表示活动,用有向边<Vi,Vj> ...

  3. AOV网络、拓扑排序、拓扑序列

    AOV网络 AOV网是有向图的一类应用,在AOV网中,用顶点表示某个有一定规模的"工程"里的不同活动,用图中的边表示各项活动之间的先后顺序关系.一种常见的AOV网实例是大学课程的先 ...

  4. BitCherry测试网络将于12月24日12:00上线

    据官方消息,BitCherry测试网络v1.0.1版本将于新加坡时间12月24日12:00点开启测试.BitCherry作为基于IPv8技术服务于商业的可扩容区块链基础设施,一直以来专注于定义和提供最 ...

  5. 有向无环图——AOV网及拓扑排序

    有向无环图--AOV网及拓扑排序 有向无环图 无环的有向图叫有向无环图,简称DAG图 其应用大致如下: 在工程计划和管理方面有着广泛而重要的应用 描述一项工程或系统的进行进程的有效工具 对整个工程和系 ...

  6. 从任务到可视化,如何理解LSTM网络中的神经元 By 机器之心2017年7月03日 14:29 对人类而言,转写是一件相对容易并且可解释的任务,所以它比较适合用来解释神经网络做了哪些事情,以及神经网

    从任务到可视化,如何理解LSTM网络中的神经元 By 机器之心2017年7月03日 14:29 对人类而言,转写是一件相对容易并且可解释的任务,所以它比较适合用来解释神经网络做了哪些事情,以及神经网络 ...

  7. 8月18日“.我爱你”域名总量:紫田网络排名跌至第十八

    IDC评述网(idcps.com)08月19日报道:据ntldstats.com最新数据显示,截至2015年8月18日17时,国内外".我爱你"域名注册总量十九强排名情况,相比上期 ...

  8. 【历史上的今天】12 月 25 日:第一个网络服务器诞生;黑客社区的创始人出生;牛顿诞生

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 25 日,在 2002 年的今天,中国造血干细胞捐献者资料库网络系统正式建立运行.目前,该 ...

  9. 电子学会青少年软件编程 Python编程等级考试一级真题解析(判断题)2021年12月

    青少年编程 Python编程等级考试一级真题解析(判断题)2021年12月 二.判断题(共10题,共20分) 26. 变量名大小写是没有区分的,如变量名stuname和StuName是没区别的.( ) ...

最新文章

  1. Go 学习笔记(56)— Go 第三方库 sqlx (操作数据库)
  2. 北理工硕士被指抄袭投稿论文,校方通报:留校察看
  3. 如何写出一个好的单例模式
  4. 电子书推荐--《Python灰帽子》,python黑客编程
  5. Android属性之build.prop生成过程分析
  6. 23篇大数据系列(二)scala基础知识全集(史上最全,建议收藏)
  7. c51编程语言基础习题,《单片机基础》练习题及答案
  8. 学生信,不是贪多的,而是求精的!
  9. overcommit_memory 内核参数
  10. 考研数据结构代码总结
  11. python识别图片文字
  12. Traceback (most recent call last): File “C:\ProgramData\Anaconda3\lib\site-packages\qtpy\QtWebEngine
  13. ipad显示已停用,连接itunes
  14. python编写程序解方程_第2章 Python初步 课后题
  15. php 函数索引 中文索引
  16. SAP 生产订单/流程订单中日期的解释
  17. 关于PyCharm中python模块无法安装的问题
  18. 从《娱乐至死》到温水青蛙
  19. vim 中的杀手级插件: vundle (vim 插件管理器)
  20. 【go语言基础】go语言的优点和缺点

热门文章

  1. Java8 HashMap 扩容之后旧元素存放位置
  2. 报错1099端口被占用的解决办法
  3. 【推荐系统->相似度算法】余弦相似度
  4. 在VS中配置snap7并用snap7与PLC通信
  5. 事情很重要却总不想开始怎么办
  6. 提醒!手机卡注销前,一定要做的四件事!
  7. 利用Python复制文件的9种方法总结
  8. Python遍历列表+remove时需要注意
  9. jdk8中tomcat修改配置PermSize为MetaspaceSize
  10. Sublime Text 3 3126 安装+注册码