拓扑排序和关键路径是如何实现的
拓扑排序的实现步骤:
由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的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
参考资料来源:百度百科-拓扑排序
参考资料来源:百度百科-时间复杂度
麻花云在7月特意为主机测评用户群定制了促销活动:香港宽频CN2云服务器、安徽移动云服务器(BGP网络,非单线,效果更好)、安徽移动独立服务器、安徽电信独立服务器,全部不限制流量,自带一个IPv4,默认5Gbps的DDoS防御。活动链接:https://www.mhyun.net/act/zjcp特价云服务器不限流量,自带一个IPv4,5Gbps防御香港宽频CN2全固态Ⅲ型 4核4G【KVM】内存:...
bgp.to在对日本东京的独立服务器进行6.5折终身优惠促销,低至$120/月;对新加坡独立服务器进行7.5折终身优惠促销,低至$93/月。所有服务器都是直连国内,速度上面相比欧洲、美国有明显的优势,特别适合建站、远程办公等多种用途。官方网站:https://www.bgp.to/dedicated.html主打日本(东京、大阪)、新加坡、香港(CN)、洛杉矶(US)的服务器业务!日本服务器CPU...
cyun怎么样?cyun蓝米数据是一家(香港)藍米數據有限公司旗下品牌,蓝米云、蓝米主机等同属于该公司品牌。CYUN全系列云产品采用KVM架构,SSD磁盘阵列,优化线路,低延迟,高稳定。目前,cyun推出的香港云服务器性价比超高,香港cn2 gia云服务器,1核1G1M/系统盘+20G数据盘,低至29元/月起;香港多ip站群云服务器,16个ip/4核4G仅220元/月起,希望买香港站群服务器的站长...
拓扑排序为你推荐
provisioned手机显示sim not provisioned mm#2,是什么意思巴西时区巴西和中国的时差是多少 里约和北京时差怎么算电子听诊器听诊器的原理廖华100个成语典故及其历史人物故事 南京廖华snoopy官网SNOOPY鞋子是品牌吗无线呼叫系统我需要一些无线呼叫器用在餐厅里,在网上看了一下全国各地的呼叫器,不知道哪一家的比较实惠好用,众说纷纭,搞不清楚,该怎么选择呢?3d规则福彩3D具体玩法,包括规则,开奖时间等?rar分卷压缩什么叫压缩分卷啊?射击类网络游戏求一些射击类的网络游戏神经网络设计设计神经网络时为什么趋向于选择更深的网络结构
黑龙江域名注册 中文域名交易中心 免费申请域名 域名商 新加坡主机 hkbn 哈喽图床 双12活动 免费静态空间 免费网络电视 java虚拟主机 网通ip 免费测手机号 爱奇艺会员免费试用 免费asp空间 新加坡空间 申请免费空间 umax 锐速 hosting24 更多