图论 —— AOE 网与关键路径
【AOE 网】
在表示一个工程时,用顶点表示事件,用弧表示活动,权值表示活动的持续时间,这样的有向图即为 AOE 网。
其有两个性质:
- 在顶点表示事件发生之后,从该顶点出发的有向弧所表示的活动才能开始。
- 在进入某个顶点的有向弧所表示的活动完成之后,该顶点表示的事件才能发生。
对于一个工程来说,只有一个开始状态和一个结束状态,因此在 AOE 网中,只有一个入度为 0 的点表示工程的开始,即源点,也只有一个出度为 0 的点表示工程的结束,即汇点。
AOE 网常用于进行工程管理,其解决的主要问题是:
- 计算完成整个工程的最短工期
- 确定关键路径,以找出哪些活动是影响工程进度的关键
【关键路径】
在 AOE 网上,从源点到汇点的具最大路径长度(该路径上行各活动持续时间的和)的路径称为关键路径,关键路径上的活动称为关键活动。
要找出关键路径,就要找出关键活动,即不按期完成就会影响整个工程的活动。
1.事件 vk 的最早发生时间 ve[k]
在保证整个工程完成的前提下,事件最早的开始时间称为事件 vk 的最早发生时间,记作:ve[k]
ve[k] 的大小实际上为从源点开始到顶点 vk 的最大路径长度,那么,求解 ve[k] 可以从源点 ve[1]=0 开始,按照拓扑排序规则递推得到
即有:
其中,len<vj,vk> 是弧 <vj,vk> 上的权值,p[k] 是所有到达 vk 的有向边的集合。
2.事件 vk 的最晚发生时间 vl[k]
在保证整个工程完成的前提下,事件最迟的开始时间称为事件 vk 的最晚发生时间,记作 vl[k]
求解 vl[k] 可以从汇点 vl[n]=ve[n] 开始,向源点递推得到,即有:
其中,len<vk,vj> 是弧 <vk,vj> 上的权值,s[k] 是所有从 vk 发出的有向边的集合。
3.活动 ai 的最早开始时间 ee[i]
在保证工程顺利完成的基础上,活动 ai 最早的必须开始时间称为活动 ai 的最早开始时间,记作:ee[i]
若活动 ai 是由弧 <vk,vj> 表示,根据 AOE 网的性质,只有事件 vk 发生后,活动 ai 才能开始
那么也就是说,活动 ai 的最早开始时间等于时间 vk 的最早发生时间,即有:
4.活动 ai 的最晚开始时间 el[i]
在不推迟整个工程完成时间的基础上,活动 ai 最迟的必须开始时间称为活动 ai 的最晚开始时间,记作:el[i]
若活动 ai 是由弧 <vk,vj> 表示,则 ai 的最晚开始时间要保证时间 vj 的最迟发生时间不拖后,即有:
其中,len<vk,vj> 是弧 <vk,vj> 上的权值
5.活动 ai 的松弛时间 el[i]-ee[i]
活动 ai 的最晚开始时间与最早开始时间的差值称为活动 ai 的松弛时间,记作:el[i]-ee[i]
当 el[i]=ee[i] 时,对应的活动 ai 称为关键活动,那些 el[i]>ee[i] 的活动则不是关键活动。
在关键活动确定后,关键活动所在的路径就是关键路径。
【实现】
1.输出关键路径
根据关键路径的定义,依次求出 ve、vl、ee、el,然后比较 ee、el 进行输出
int n,m;
int G[N][N];//邻接矩阵
int in[N];//入度
int ve[N];//事件vk的最早发生时间
int vl[N];//事件vk的最晚发生时间
int ee[N];//活动ai的最早开始时间
int el[N];//活动ai的最晚开始时间
int Stack[N];//栈
struct Edge {int x,y;int dis;Edge(){}Edge(int x,int y,int dis):x(x),y(y),dis(dis){}
}edge[N];
bool vis[N];void getVe(){//求veint cnt=0;for(int i=1;i<=n;i++){int k=-1;for(int j=1;j<=n;j++){if(in[j]==0){Stack[++cnt]=j;k=j;in[j]=-1;break;}}for(int j=1;j<=n;j++){if(G[k][j]!=INF){ve[j]=max(ve[j],ve[k]+G[k][j]);in[j]--;}}}
}
void getVl(){//求vlmemset(vl,INF,sizeof(vl));vl[Stack[n]]=ve[Stack[n]];for(int i=n;i>=1;i--){for(int j=1;j<=n;j++){if(G[Stack[i]][j]!=INF) {vl[Stack[i]]=min(vl[j]-G[Stack[i]][j],vl[Stack[i]]);}}}
}
void getEe(){//求eefor(int i=1;i<=m;i++)ee[i]=ve[edge[i].x];
}
void getEl(){//求elfor(int i=1;i<=m;i++)el[i]=vl[edge[i].y]-edge[i].dis;
}void printEdge(){//以边输出for(int i=1;i<=m;i++)if(ee[i]==el[i])printf("<%d,%d>:%d\n", edge[i].x, edge[i].y, edge[i].dis);
}
void printNode(){//以点输出priority_queue<int,vector<int>,greater<int> > Q;memset(vis,false,sizeof(vis));for(int i=1;i<=m;i++){if(ee[i]==el[i]){int x=edge[i].x;int y=edge[i].y;if(!vis[x]){Q.push(x);vis[x]=true;}if(!vis[y]){Q.push(y);vis[y]=true;}}}while(!Q.empty()){int temp=Q.top();Q.pop();printf("v%d ",temp);}
}
int main() {memset(G,INF,sizeof(G));scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y,dis;scanf("%d%d%d",&x,&y,&dis);edge[i].x=x;edge[i].y=y;edge[i].dis=dis;G[x][y]=dis;in[y]++;}getVe();getVl();getEe();getEl();printf("以边输出:\n");printEdge();printf("以点输出:\n");printNode();return 0;
}
2.求关键路径长度
由于关键路径是具有最大路径长度的路径,因此直接求有向图的最长路即为关键路径的长度
struct Node{int to,dis;Node(){}Node(int to,int dis):to(to),dis(dis){}
};
int n,m;
int in[N];
vector<Node>G[N];
int dis[N];
void getPath() {queue<int> Q;for(int i=0;i<n;i++){if(in[i]==0){Q.push(i);dis[i]++;}}while(!Q.empty()){int x=Q.front();Q.pop();for(int i=0;i<G[x].size();i++){int y=G[x][i].to;int diss=G[x][i].dis;dis[y]=max(dis[y],dis[x]+diss);if (--in[y]==0)Q.push(y);}}
}
int main() {scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y,dis;scanf("%d%d%d",&x,&y,&dis);G[x].push_back(Node(y,dis));in[y]++;}getPath();int res=-INF;for(int i=0;i<n;i++)res=max(res,dis[i]);printf("%d\n",res);return 0;
}
【例题】
- Instrction Arrangement(HDU-4109)(求关键路径长度):点击这里
图论 —— AOE 网与关键路径相关推荐
- AOE网与关键路径简介
前面我们说过的拓扑排序主要是为解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题.如果我们要对一个流程图获得最短时间,就必须要分析它们的拓扑关系,并且找到当中最关键的流程, ...
- AOE网与关键路径、关键路径算法
AOE网与关键路径 在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动持续的时间,称这样的有向图为边表示活动的网,简称 AOE网(activity on edge ne ...
- dhu 6 获取AOE网的关键路径
6 获取AOE网的关键路径 作者: 冯向阳时间限制: 1S章节: 课程设计 问题描述 : 建立一个有向网AOE网,设计并完成一算法Get_CriticalPath(),获取关键路径.该路径仅输出,不须 ...
- 【数据结构和算法笔记】AOE网和关键路径
目录 AOE网的概念: 关键路径:(critical path) 求关键路径和关键活动: 事件的最早开始时间(event early): 事件的最迟开始时间(event late): 活动的最早开始 ...
- AOE网:关键路径和关键活动
关键路径 在我的经验意识深处,"关键"二字一般都是指临界点. 凡事万物都遵循一个度的问题,那么存在度就会自然有临界点. 关键路径也正是研究这个临界点的问题. 在学习关键路径前,先了 ...
- 选择题快速求解AOE网的关键路径
#引言 求解AOE网关键路径时,书上的方法为先从源点到汇点求解事件最早发生时间ve,再从汇点到源点求解事件最迟发生时间vl,再利用ve和vl求解每个活动的最早开始时间e(i)和最迟开始时间l(i),e ...
- AOE网的关键路径的计算
求关键路径,只需理解顶点(事件)和边(活动)各自的两个特征属性以及求法即可: Ø 先根据首结点的Ve(j)=0由前向后(正拓扑序列)计算各顶点的最早发生时间 Ø 再根据终结点的Vl(j)等于它的V ...
- 有向无环图——AOE网(关键路径)
有向无环图:无环的有向图,简称DAG图(Directed Acycline Graph) 有向无环图常用来描述一个工程或系统的进行过程.(通常吧计划.施工.生产.程序流程等当成是一个工程) 一个工程可 ...
- 数据结构:图:AOV网和AOE网
AOV网(顶点表示活动的网):以有向图中的顶点来表示活动,以有向边来表示活动之间的先后次序关系. AOV网的拓扑序列:AOV网的拓扑序列就是将AOV网中的所有顶点排成一个线性序列:拓扑序列实际上就是要 ...
最新文章
- mysql show命令用不了_MySQL show命令的用法 | 很文博客
- 解决启动httpd报: apr_sockaddr_info_get() failed for错误
- Mark Links@2012/8/25
- Asp.NET获取文件及其路径
- ntu 课程笔记 :MAS714(7) 最短路径和优先队列
- 计算机视觉--GIST特征及其MATLAB代码实现
- CentOS 7.0安装Nvidia驱动
- rubymine 调试 redmine
- java线程创建方式_Java创建线程安全的方法
- Table隔行变色的JavaScript代码
- bzoj 4942 整数 思考记录
- ios 筛选_LOL手游开始筛选玩家对安卓和IOS有不同要求,不达标可以放弃了
- linux下ORACLE之RAW创建
- 电脑数据恢复,哪种方法靠谱?
- ios tabbar中间凸起_移动端开发基础【21】tabBar 配置
- 深度学习 轻量级卷积神经网络设计综述
- python dwg文件 读取_如何使用Python打开DWG文件扩展名?
- 国内交通银行OSA账户被注销后,企业该如何面对这种局面?
- 人工智能、机器学习和深度学习的关系
- ubuntu添加并查看 用户组和用户