图的拓扑排序,AOV,完整实现,C++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
AOV:3 → 1 → 2 → 6 → 0 → 4 → 5 → 8 → 7 → 12 → 9 → 10 → 13 → 11 |
|
| /* AOV.h */
#ifndef __AOV_H__
#define __AOV_H__
#include<iostream>
#include"Graph.h"
namespace meihao
{
//边表结点
typedef struct EdgeNode
{
int vertexIdx; //邻接点域,存放该结点在顶点表数组中的下标
struct EdgeNode* next; //存放下一个边表结点的位置
}edgeNode,*pEdgeNode;
//顶点表结点
typedef struct VertexNode
{
int in; //顶点入度
int data; //顶点与,存放顶点数据信息
edgeNode* firstEdge;
}vertexNode,*pVertexNode;
void initDataStruct(const meihao::Graph& g,vertexNode*& vertexArr); //根据图来初始化出我们要的顶点数组和对应的边表
int TopologicalSort_AOV(const meihao::Graph& g); //成功返回0,失败返回-1
};
#endif
/* testmain.cpp */
#include"AOV.h"
#include"Graph.h"
#include<iostream>
using namespace std;
int main()
{
meihao::Graph g("data.txt");
int ret = meihao::TopologicalSort_AOV(g);
if(0==ret)
cout<<"success!"<<endl;
else
cout<<"fail!"<<endl;
system("pause");
}
|
/* AOV.cpp */
#include"AOV.h"
#include<stack>
namespace meihao
{
void initDataStruct(const meihao::Graph& g,vertexNode*& vertexArr)
{
int vertexNum = g.getGraphVertexNumber();
vertexArr = new vertexNode[vertexNum](); //建立顶点数组
for(int idx=0;idx!=vertexNum;++idx)
{
vertexArr[idx].data = idx;
vertexArr[idx].in = g.getInputDegree(idx); //获取入度
vertexArr[idx].firstEdge = nullptr;
}
for(int idx=0;idx!=vertexNum;++idx)
{
for(int iidx=0;iidx!=vertexNum;++iidx)
{
if(1==g.getGraphEdgeWeight(idx,iidx))
{
edgeNode* tmp = new edgeNode();
tmp->vertexIdx = iidx;
tmp->next = vertexArr[idx].firstEdge;
vertexArr[idx].firstEdge = tmp;
}
}
}
}
int TopologicalSort_AOV(const meihao::Graph& g)
{
stack<int> zeroInputDegreeVertex;
int vertexNum = g.getGraphVertexNumber();
vertexNode* vertexArr = nullptr; //建立顶点表数组
initDataStruct(g,vertexArr); //建立顶点边和对应的边表
for(int idx=0;idx!=vertexNum;++idx)
{
if(0==vertexArr[idx].in)
{
zeroInputDegreeVertex.push(idx);
}
}
//遍历输出拓扑排序
int cnt = 0; //统计拓扑排序输出的点数,如果cnt最后不等于图的顶点数,说明不是AOV
while(!zeroInputDegreeVertex.empty())
{
int idx = zeroInputDegreeVertex.top();
cout<<vertexArr[idx].data<<" "; //输出一个度为0的顶点
zeroInputDegreeVertex.pop();
++cnt;
for(edgeNode* node = vertexArr[idx].firstEdge;nullptr!=node;node=node->next)
{ //删除了一个度为0的顶点,对应其出边表中的顶点的入得要减1
vertexArr[node->vertexIdx].in--;
if( 0==(vertexArr[node->vertexIdx].in) )
zeroInputDegreeVertex.push( node->vertexIdx );
}
}
if(vertexNum==cnt)
return 0;
else
return -1;
}
};
|
图的拓扑排序,AOV,完整实现,C++描述的更多相关文章
- 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆. 现在 ...
- 拓扑排序---AOV图
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中全部顶点排成一个线性序列, 使得图中随意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出如 ...
- AOV图与拓扑排序&AOE图与关键路径
AOV网:所有的工程或者某种流程可以分为若干个小的工程或阶段,这些小的工程或阶段就称为活动.若以图中的顶点来表示活动,有向边表示活动之间的优先关系,则这样活动在顶点上的有向图称为AOV网. 拓扑排序算 ...
- 数据结构之---C语言实现拓扑排序AOV图
//有向图的拓扑排序 //杨鑫 #include <stdio.h> #include <stdlib.h> #include <string.h> #define ...
- C#实现有向无环图(DAG)拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在 ...
- POJ - 3249 Test for Job (在DAG图利用拓扑排序中求最长路)
(点击此处查看原题) 题意 给出一个有n个结点,m条边的DAG图,每个点都有权值,每条路径(注意不是边)的权值为其经过的结点的权值之和,每条路径总是从入度为0的点开始,直至出度为0的点,问所有路径中权 ...
- 【数据结构】【图文】【oj习题】 图的拓扑排序(邻接表)
拓扑排序: 按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系,由此所得顶点的线性序列称之为拓扑有序序列.显然对于有回路的有向图得不 ...
- Paint the Grid Again (隐藏建图+优先队列+拓扑排序)
Leo has a grid with N × N cells. He wants to paint each cell with a specific color (either black or ...
- 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)
题意: 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花 ...
随机推荐
- 第 8 章 容器网络 - 058 - flannel 概述
flannel 概述 flannel 是 CoreOS 开发的容器网络解决方案. flannel 为每个 host 分配一个 subnet,容器从此 subnet 中分配 IP,这些 IP 可以在 h ...
- 【转载】LINUX下安装wget命令(SFTP实现法)
如何安装wget命令. 方法一:通过yum 命令行为:yum install wget 完成.此操作很简单,但是我安装的linux是centos的最小版本,运行上述命令时会出现无法连接到源网站(大概是 ...
- Adobe Photoshop CC 2018 v19.0 简体中文正式版下载安装破解(附注册机+破解教程) 32/64位(安装破解注意事项是什么)
Adobe Photoshop CC 2018 v19.0 简体中文正式版下载安装破解(附注册机+破解教程) 32/64位(安装破解注意事项是什么) 一.总结 一句话总结:下载安装破解教程文中都有,需 ...
- 基于Struts2框架的文件下载 --- Struts2
一.Struts2指定类型文件的下载 1.最终功能实现的截图:(点击文件下载链接,下载文件 ) 2.核心代码 index.jsp: <%@ page language="java&qu ...
- piggy.lnk 简析
piggy.lnk 简析 SECTIONS { .data : { input_len = .; LONG(input_data_end - input_data) input_data = .; * ...
- caffe 动态库 Release X64
Release X64平台 createdll.h#ifndef CREARDLL_H_#define CREARDLL_H_ extern "C" _declspec(dllex ...
- jq 倒计时
引入jq 注 在IE和safari 如果时间出现NAN 将时间格式改为YYYY/MM/DD HH:MM:SS 例:var d2 = new Date("2019/02/18 15:59&qu ...
- 『C++』STL容器入门
最近在学习opencv,因为C++基础很烂,所以遇到了不少问题,其中STL模块也是没少接触,特此简单了解一下STL的容器类型(主要是Vector)和迭代器的简单用法. C++ STL(标准模板库)是一 ...
- 『计算机视觉』FPN:feature pyramid networks for object detection
对用卷积神经网络进行目标检测方法的一种改进,通过提取多尺度的特征信息进行融合,进而提高目标检测的精度,特别是在小物体检测上的精度.FPN是ResNet或DenseNet等通用特征提取网络的附加组件,可 ...
- springboot项目线程使用2
线程处理的一个实际例子: @Service public class SynAsynThreadTestServiceImpl implements SynAsynThreadTestService ...