图 学习笔记
Posted 未定_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图 学习笔记相关的知识,希望对你有一定的参考价值。
一、有向无环图及其应用
1.AOV网与拓扑排序
AOV网: 在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,称这样的有向图为顶点表示活动的网,简称AOV网。
其中弧表示活动之间的制约关系,AOV网不能有回路。
拓扑排序: 参考学习笔记(一)
·"无前驱"顶点优先的另一种实现:
图存储:邻接表,在顶点表中增加入度域;栈:存储所有无前驱的顶点(入度为零的顶点)。
#include<bits/stdc++.h>
using namespace std;
const int MaxSize = 10;
struct EdgeNode//边表结点结构体
int adjvex;//该顶点的邻接点在顶点表中的下标
EdgeNode *next;
;
struct VertexNode//顶点表结点结构体
int in;//入度
int vertex;//存放顶点信息
EdgeNode *firstEdge;//指向边表的第一个结点
;
class ALGraph
public:
ALGraph(int a[], int n, int e); //构造函数,建立n个顶点e条边的图
~ALGraph();
void TopSort();
private:
VertexNode adjlist[MaxSize]; //存放顶点表的数组
int vertexNum,edgeNum;//顶点数和边数
;
ALGraph::ALGraph(int a[],int n,int e)
int i,j,k;
EdgeNode *s=NULL;
vertexNum=n;
edgeNum=e;
for(i=0; i<vertexNum; i++) //初始化顶点表
adjlist[i].vertex=a[i];
adjlist[i].firstEdge=NULL;
for(k=0; k<edgeNum; k++)
cin>>i>>j;
s=new EdgeNode;
s->adjvex=j;
s->next=adjlist[i].firstEdge;
adjlist[i].firstEdge=s;//头插法
for(i=0; i<vertexNum; i++)
cin>>adjlist[i].in;
ALGraph::~ALGraph()
EdgeNode *p=NULL,*q=NULL;
for(int i=0; i<vertexNum; i++)
p=q=adjlist[i].firstEdge;
while(p!=NULL)
p=p->next;
delete q;
q=p;
void ALGraph::TopSort()
int i,j,k,count=0;
int S[MaxSize],top=-1;
EdgeNode *p=NULL;
for(i=0; i<vertexNum; i++)
if(adjlist[i].in==0)
S[++top]=i;
while(top!=-1)
j=S[top--];
cout<<adjlist[j].vertex<<" ";
count++;
p=adjlist[j].firstEdge;
while(p!=NULL)
k=p->adjvex;
adjlist[k].in--;
if(adjlist[k].in==0)
S[++top]=k;
p=p->next;
if(count<vertexNum)
cout<<"有回路";
int main()
int ch[]= 0,1,2,3;
ALGraph ALG(ch,4,4);
ALG.TopSort();
return 0;
2.AOE网与关键路径
AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动的持续时间,这样的有向图叫做边表示活动的网,称为AOE网。
AOE网中没有入边的顶点称为始点(或源点),没有出边的顶点称为终点(或汇点)。正常的AOE网只有一个始点和一个终点。
AOE网的性质:
⑴ 只有在某顶点所代表的事件发生后,从该顶点出发的各活动才能开始;
⑵ 只有在进入某顶点的各活动都结束,该顶点所代表的事件才能发生。
某工程如下:
事件的最早发生时间ve[k]
根据性质:只有在进入某顶点的各活动都结束,该顶点所代表的事件才能发生。顶点最早发生时间取决于前面活动结束最晚的,所以,顶点vk的最早发生时间ve[k]应该等于前一个顶点max(ve[j]+len<vj,vk>)。初始化ve[0]=0;
事件的最迟发生时间vl[k]
vl[k]是指在不推迟整个工期的前提下,事件vk允许的最晚发生时间。
因为整个工期不能延期,所以vl[n-1]=ve[n-1],即最后一个事件的最早与最迟发生时间一致才不会延期。这也就是初始化。
所以倒着考虑,根据性质只有在某顶点所代表的事件发生后,从该顶点出发的各活动才能开始。即在后一项事件vj,最迟发生时间的基础上减去len<vk,vj>即可,又因为事件vk后面可能有多个活动,为了让持续时间最长的活动也能按期完成,所以vl[k]=min(vl[j]-len<vk,vj>)
活动的最早开始时间e[i]
因为活动由<vk , vj>表示,活动的最早开始时间应等于事件vk的最早发生时间。所以e[i]=ve[k];
活动的最晚开始时间l[i]
根据性质只有在进入某顶点的各活动都结束,该顶点所代表的事件才能发生。倒推活动的最晚开始时间应该等于后一事件的最晚开始时间-活动持续时间,也就是el[i]=vl[j]-len<vk,vj>。这里与事件最晚开始时间的区别是没有min,因为事件会受到多个活动的影响。
关键路径:在AOE网中,从始点到终点具有最大路径长度(该路径上的各个活动所持续的时间之和)的路径称为关键路径。
关键活动:关键路径上的活动称为关键活动。
上图标红的路线就是关键路径,关键路径不一定唯一,e[i]=l[i]的活动是关键活动。
注意:任意一个关键活动延期,整个工期会延期(✓)
任意一个关键活动加快,整个工期不一定会加快(✓)可能有多个关键路径
任意一个非关键活动延期,工期一定不会延期(×)因为延期有范围
任意一个非关键活动加快,工期一定不会加快(✓)
以上是关于图 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章