拓扑排序拓扑排序时间复杂度o(n+e)怎么算的?

拓扑排序  时间:2021-08-09  阅读:()

拓扑排序和关键路径是如何实现的

拓扑排序的实现步骤: 由AOV网构造拓扑序列的拓扑排序算法主要是循环执行以下三步,直到不存在入度为0的顶点为止; (1) 选择一个入度为0的顶点并输出之; (2) 从网中删除此顶点及所有出边; (3) 循环结束后,若输出的顶点数小于网中的顶点数,则输出“有回路”信息,否则输出的顶点序列就是一种拓扑序列。

求关键路径的算法: (1) 输入e条弧<j,k>,建立AOE网的存储结构。

(2) 从源点v1出发,令ve(1)=0,求 ve(j) 2<=j<=n。

(3) 从汇点vn出发,令vl(n)=ve(n),求 vl(i) 1<=i<=n-1。

(4) 根据各顶点的ve和vl值,求每条弧s(活动)的最早开始时间e(s)和最晚开始时间l(s),其中e(s)=l(s)的为关键活动。

数据结构问题~什么图可以进行拓扑排序~什么图不能进行拓扑排序?

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

拓扑排序(Topological Sort) 什么是拓扑序列 通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。

简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

离散数学中关于偏序和全序的定义: 若集合X上的关系是R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。

设R是集合X上的偏序(Partial Order),如果对每个x,y属于X必有xRy 或 yRx,则称R是集合X上的全序关系。

注意: ①若将图中顶点按拓扑次序排成一行,则图中所有的有向边均是从左指向右的。

②若图中存在有向环,则不可能使顶点满足拓扑次序。

③一个DAG的拓扑序列通常表示某种方案切实可行。

求C语言高手!数据结构的拓扑排序

算法 1.无前趋的顶点优先: (1)算法描述: (a)从网中选择一个入度为零的顶点输出; (b)删除该顶点及其于该点有关的所有边; (c)是否还有入度为零的顶点?若有,执行(a),否则结束。

算法实现 以邻接表为图的存储结构的算法: a)扫描顶点表,将入度为零的顶点入栈; b)当栈非空时: 输出栈顶元素v,出栈; 检查v的出边,将每条出边的终端顶点的入度减1,若该顶点入度为0,入栈; c)当栈空时,若输出的顶点小于顶点数,则说明AOV网有回路,否则拓扑排序完成。

算法实现: void Graph::Toplogicasort()/是入度为0的顶点栈的栈顶指针 { =-1; for(int i=0;i<n;i++) //建立如度为0顶点的链栈 if (count[i]==0) { count[i]; =i; } for(int i=0;i<n;i++) ==-1) { cout<<"Network has a cycle"<<endl; return; } else { int =];//入度为0的顶点出栈 count<<j<<endl; Edge<float> *l=NodeTable[j].adj; while(l) { int k=l,dest; if(--count[k]==0) { count[k];//入度减至0的顶点进栈 =k; } l=l->link;//取j的下一条出边 } } } /*通常的拓扑算法要用两个数组,一个用来记录每个顶点的入度,当入度为0,则进栈 。

另一个数组用作栈数组,记录入度为0的顶点。

其实当入度为0的顶点进栈以后,count[i] =0就不再有用,所以可以用count[i]记录栈内下一个入度为0的顶点指向栈顶顶点号 */

怎样实现c语言的拓扑排序啊,谁能帮我写一下代码啊 谢谢啊

#include #include #define Max_VertexNum 100 //顶点个数的宏定义 /*邻接表结点*/ typedef struct node{ int adjvex; /*邻接点域*/ struct node *next;/*链域*/ }EdgeNode; /*顶点结点*/ typedef struct vnode{ int vertex; //顶点域 int Degree; //存放入度 EdgeNode *firstedge; //边头指针 }VertexNode; typedef VertexNode Adjlist[Max_VertexNum];//定义一个邻接表的数组,用于存放顶点的信息 /*图的定义*/ typedef struct ALGraph{ Adjlist adjlist; int n,e;//图的顶点和边 }Graph; /* 为了避免重复检测入度为0的顶点,设置一个栈暂存所有入度为0的顶点 */ typedef struct stacknode{ int data; struct stacknode *next; }StackNode; typedef struct{ StackNode ; //栈顶指针 }LinkStack; ////////////////////////////////////////////////////////////////////////////////////////// //辅助栈的相关定义 /* 初始化栈 */ void InitStack(LinkStack *S) { =NULL; } /* 判空 */ int IsEmpty(LinkStack *S) { return(==NULL); } /* 进栈 */ void Push(LinkStack *S,int x) { StackNode *p; p=(StackNode*)malloc(sizeof(StackNode)); p->data=x; p->next=; =p; } /* 出栈 */ int Pop(LinkStack *S) { int x; StackNode *p=; //保存头指针 if(IsEmpty(S)) { printf("栈为空!"); exit(1); } x=p->data; =p->next; //将栈顶结点从栈上摘下 free(p); return x; } //////////////////////////////////////////////////////////////////////////////////////////////////// /* 建立一个有向图,其存储结构为邻接表 */ void CreateGraph(Graph *G) { int i,j,k; EdgeNode *s; printf("请输入图的顶点数和边数: "); scanf("%d %d",&G->n,&G->e); //建立顶点列表 for(i=1;i<=G->n;i++) { printf("请输入顶点的信息: "); printf(" "); scanf("%d",&G->adjlist[i].vertex); G->adjlist[i].firstedge=NULL; } for(k=0;ke;k++) { printf("请输入边(vi,vj)的顶点序号: "); printf(" "); scanf("%d%d",&i,&j); s=(EdgeNode*)malloc(sizeof(EdgeNode)); //生成边表结点 s->adjvex=j; s->next=G->adjlist[i].firstedge; G->adjlist[i].firstedge=s; //将新建的结点插入到边表的头部 } } ///////////////////////////////////////////////////////////////////////////////////////////////////////// /* 对各个顶点求入度 */ void FindInDegree(Graph *G) { int i,j; EdgeNode *p; for(i=1;i<=G->n;i++) { G->adjlist[i].Degree=0; } for(j=1;j<=G->n;j++) { for(p=G->adjlist[j].firstedge;p;p=p->next) { G->adjlist[p->adjvex].Degree++; } /* p=G->adjlist[j].firstedge; while(p!=NULL) { G->adjlist[p->adjvex].Degree++; p=p->next; } */ } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// /* 进行拓扑有序排列 */ int TopoSort(Graph *G) { int i,m,k; int count=0; LinkStack S; FindInDegree(G); InitStack(&S); for(i=1;i<=G->n;i++) { if(!G->adjlist[i].Degree) { Push(&S,i); } } while(!IsEmpty(&S)) { m=Pop(&S); printf("(%d,%d)",m,G->adjlist[m].vertex); //输出i号顶点并计数 count++; for(EdgeNode *p=G->adjlist[m].firstedge;p;p= p->next) { k=p->adjvex; if(!(--G->adjlist[k].Degree)) { Push(&S,k); } } } if(countn) { printf("有回路!"); exit(1); } else { return 0; } } //////////////////////////////////////////////////////////////////////////////////////////////////////////// /* 输出有向图 */ void PrintAdjlist(Graph *G) { int i; EdgeNode *p; for(i=1;i<=G->n;i++) { printf("%d:%d",i,G->adjlist[i].vertex); for(p=G->adjlist[i].firstedge;p;p=p->next) { printf("%d",p->adjvex); } printf(" "); } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /* 主函数 */ void main() { Graph G; CreateGraph(&G); PrintAdjlist(&G); TopoSort(&G); }

拓扑排序时间复杂度o(n+e)怎么算的?

对有n个顶点和e条弧的有向图而言,建立求各顶点的入度的时间复杂度为O(e);建零入度顶点栈的时间复杂度为O(n);在拓扑排序过程中,若有向图无环,则每个顶点进一次栈、出一次栈,入度减1的操作在while语句中总共执行e次,所以总的时间复杂度为O(n+e)。

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

通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。

简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。

算法分析的目的在于选择合适算法和改进算法。

计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。

这是一个关于代表算法输入值的字符串的长度的函数。

时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。

使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。

扩展资料 在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出 T(n) 的同数量级,找出后,f(n) = 该数量级,若 T(n)/f(n) 求极限可得到一常数c,则时间复杂度T(n) = O(f(n))。

按数量级递增排列,常见的时间复杂度有: 常数阶O(1),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3),..., k次方阶O(n^k),指数阶O(2^n)。

随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。

参考资料来源:百度百科-拓扑排序 参考资料来源:百度百科-时间复杂度

阿里云金秋上云季,云服务器秒杀2C2G5M年付60元起

阿里云(aliyun)在这个月又推出了一个金秋上云季活动,到9月30日前,每天两场秒杀活动,包括轻量应用服务器、云服务器、云数据库、短信包、存储包、CDN流量包等等产品,其中Aliyun轻量云服务器最低60元/年起,还可以99元续费3次!活动针对新用户和没有购买过他们的产品的老用户均可参与,每人限购1件。关于阿里云不用多说了,国内首屈一指的云服务器商家,无论建站还是学习都是相当靠谱的。活动地址:h...

酷番云78元台湾精品CN2 2核 1G 60G SSD硬盘

酷番云怎么样?酷番云就不讲太多了,介绍过很多次,老牌商家完事,最近有不少小伙伴,一直问我台湾VPS,比较难找好的商家,台湾VPS本来就比较少,也介绍了不少商家,线路都不是很好,有些需求支持Windows是比较少的,这里我们就给大家测评下 酷番云的台湾VPS,支持多个版本Linux和Windows操作系统,提供了CN2线路,并且还是原生IP,更惊喜的是提供的是无限流量。有需求的可以试试。可以看到回程...

Pacificrack:新增三款超级秒杀套餐/洛杉矶QN机房/1Gbps月流量1TB/年付仅7美刀

PacificRack最近促销上瘾了,活动频繁,接二连三的追加便宜VPS秒杀,PacificRack在 7月中下旬已经推出了五款秒杀VPS套餐,现在商家又新增了三款更便宜的特价套餐,年付低至7.2美元,这已经是本月第三波促销,带宽都是1Gbps。PacificRack 7月秒杀VPS整个系列都是PR-M,也就是魔方的后台管理。2G内存起步的支持Windows 7、10、Server 2003\20...

拓扑排序为你推荐
getsockopt如何判断socket已经断开aftereffectAfter effect Premere分别是什么软件,做什么的?电子听诊器听诊器有哪些用途的知识横幅广告如何在应用中添加Admob横幅广告碰撞球碰撞分为哪几种,分别解释一下网页错误详细信息网页错误详细信息 消息: 'this._self.style' 为空或不是对象jsharejshare里拓荒者是什么?- -3d规则福彩3D的规则是怎么样的平均数计算器用计算器CASIO fx82 怎样计算平均数腾讯qq号申请QQ号怎么申请
域名注册使用godaddy 申请免费域名 本网站服务器在美国维护 omnis 2017年万圣节 hostloc 电信主机 免费外链相册 smtp服务器地址 lamp兄弟连 摩尔庄园注册 广州服务器托管 电信主机托管 汤博乐 phpwind论坛 美国vpn服务器 stealthy 电脑显示屏不亮但是主机已开机 天翼云主机 什么是云主机 更多