赞
踩
目录
类似树的广度遍历
FirstNeighbor(G,x):求图G中顶点x的第一个邻接点,若有则返回顶点号,没有返回-1
NextNrighbor(G,x,y):假设图G中顶点y是顶点x的邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y就是最后一个返回-1
- bool visited[MAX_VERTEX_NUM]; //访问标记数组
- void BFS(Graph G,int v){
- visit(v); //访问初始顶点v
- visited[v]=TRUE; //对v做已访问标记
- Enqueue(Q,v); //入队列
- while(!isEmpty(Q)){
- Dequeue(Q,v); //顶点v出队
- for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w)){ //检测v所以邻接点
- if(!visited[w]){
- visit(w); //访问顶点w
- visited[w]=TRUE; //对w做已访问标记
- Enqueue(Q,w); //入队列
- }
- }
- }
- }
- void BFSraverse(Graph G){
- for(i=0;i<G.vexnum;++i)
- visired[i]=FASLE; //初始化标记数组
- InitQueue(Q); //初始化辅助队列
- for(i=0;i<G.vexnum;++i)
- if(!visited[i]) //对每个连通分量调用一次BFS
- BFS(G,i);
- }
空间复杂度:最坏。辅助队列O(V)
邻接矩阵时间复杂度:
邻接表时间复杂度:
邻接表生成不唯一,具体看数据先后顺序
一个连通分量一个树,多个(非连通图)就是森林
类似树的先序遍历
- bool visited[MAX_VERTEX_NUM]; //访问标记数组
- void DFS(Graph G,int v){
- visit(v); //访问v
- visited[v]=TRUE; //标记已访问
- for(w=FirstNeighbor(G,V);w>=0;w=NextNeighor(G,v,w)) //邻接顶点
- if(!visited[w]){
- DFS(G,w);
- }
-
- }
- void DFSraverse(Graph G){
- for(v=0;v<G.vwxnum;++v)
- visited[v]=FALSE;
- for(v=0;v<G.vexnum;++v)
- if(!visited[v])
- DFS(G,v);
- }
空间复杂度:最后O(1) ,最坏情况:O(V)
邻接矩阵时间复杂度:
邻接表时间复杂度:
邻接表存储顺序性不一致,遍历序列不一样
邻接表生成不唯一,具体看数据先后顺序
一个连通分量一个树,多个(非连通图)就是森林
从某一个顶点开始构建生成树;每一次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止
时间复杂度:
每次选择一条权值最小边,使这条边两头连通(已经连通不用),直到所有结点连通
时间复杂度:
动态规划思想
每轮看
A | |||||||||||||
0 | 6 | 13 | 0 | 6 | 13 | 0 | 6 | 10 | 0 | 6 | 10 | ||
10 | 0 | 4 | 10 | 0 | 4 | 10 | 0 | 4 | 9 | 0 | 4 | ||
5 | ∞ | 0 | 5 | 11 | 5 | 5 | 11 | 0 | 5 | 11 | 0 |
中转点为第几轮换的就是几
-1 | -1 | 1 | ||
2 | -1 | -1 | ||
-1 | 0 | -1 |
第一轮(
第二轮(
第三轮(
几个顶点几轮
根据上面
A(2) 可知V1 到V2 最短路径为4,根据path(2) 为-1没有中转,路径为V1−>V2 根据上面
A(2) 可知V0 到V2 最短路径为10, 根据path(2) 为1,经过V1 顶点中转,路径为V0−>V1−>V2
- for(int k=0;k<n;lk++){ //考虑vk为中转点
- for(int i=0;i<n;i++){ //遍历矩阵,i行,j列
- for(int j=0;j<n;j++){
- if(A[i][j]>A[i][k]+A[k][j]){ //以vk为中转点的路径更短
- A[i][j]=A[i][k]+A[k][j]; //最短路径
- path[i][j]=k; //中转点
- }
- }
- }
- }
时间复杂度:
空间复杂度:
若一个有向图中不存在环,则称为有向无环图,简称DAG图
有向无环图是描述含有公共子式的表达式的有效工具,列如表达式
DAG不可能出现重复操作数
AOV网:若用DAG图表示一个工程图,其顶点表示活动,用边表示活动
时间复杂度:
若采用邻接矩阵则
在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的 开销(如时间),称之为用边表示活动的网络,简称AOE网
源点:AOE网仅有一个入度未0的顶点,称为开始顶点(源点),表示工程的开始。
汇点:也仅有一个出度为0的顶点,称结束顶点(汇点),表示工程的结束
关键路径:从源点到汇点路径可能有多条,所有路径中,路径出度最大的为关键路径
事件(顶点)
vk 最早发生时间ve(k) :决定了所有从vk 开始的活动能够开工的最早时间活动(边)
ai 的最早开始时间e(i) :指该活动弧的起点所表示事件的最早发生时间事件
vk 的最迟发生时间vl(k) :指不推迟整个工程前提下,事件最迟必选发生的时间e(i)=ve(k) 活动(边)
ai 的最迟开始时间l(i) :指活动弧的终点所表示事件的最迟发生时间与该活动所需时间之差。l(i)=vl(i)−Weight(vk,vj) 时间余量:
d(i)=l(i)−e(i)
关键活动、关键路径的特性
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。