5-图论算法ppt课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
G(V,E)是无向连通赋权图,G’(V,E’)是包含G中所 有顶点的树,且树中各边权总和最小,则G’是最小 生成树(可能不唯一)
容易想到,用贪心策略。 Prim Kruskal
Prim思想
—最小生成树篇
1.从V中任取一结点放入V'; 2.在所有的端点分别在(V-V')和V'中的边中,选一条
权最小的加入E'; 3.将边E'在(V-V')中的顶点从V中取出放入V'; 4.重复步骤2~3,直到V'与V相等为止。
int i,j,k,min,lowcost[vex],closest[vex];
for(i=2;i<=n;i++) { lowcost[i]=c[1][i];//第1个点到其他点的代价
用closest[i]=0表示i点在
closest[i]=1;//初始时,所有点的起点都是点1 u集合中, lowcost[i]当前
算法实现要点: 用并查集的相关操作:实现集合的并;判断 新边的两端点是否处于同一集合,来确定是否构成回路。
最短路径 (Shortest Path):
最短路径问题:如果从图中某一顶点(称为源点) 到达另一顶点(称为终点)的路径可能不止一条, 如何找到一条路径使得沿此路径上各边上的权值 总和达到最小。
图的遍历
遍历要访问到图中的每一个顶点。 BFS (Breadth-First Search) DFS (Depth-First Search)
BFS思想
—遍历篇
1.从图中某顶点v0出发,在访问了v0之后,搜索v0 的(所有未被访问的)邻接顶点v1.v2…
2.依次从这些邻接顶点出发,广搜图中其它顶点, 直至图中所有已被访问的顶点的邻接顶点都被访问 到。
Kruscal 示例:
• 实例的执行过程
1
6
5 1
25 35 4
3
6
4
2
566
1
1
5
25
5
3
4
3
5
4
2
6
1、初始连通分量:{1},{2},{3},{4},{5},{6} 2、反复执行添加、放弃动作。条件:边数不等于 n-1时
边 动作 连通分量 (1,3) 添加 {1,3},{4},{5},{6},{2} (4,6) 添加 {1,3},{4, 6},{2},{5} (2,5) 添加 {1,3},{4, 6},{2,5} (3,6) 添加 {1,3,4, 6},{2,5} (1,4) 放弃 因构成回路 (3,4) 放弃 因构成回路 (2,3) 添加 {1,3,4,5,6,2}
//时间复杂度:O(V+E)
DFS程序基本结构
void DFS(int step) {
for(i=0; i<Max_Elements; i++) {
if(子结点符合条件) {
新子结点入栈; if(是目标结点)
输出 else
DFS(step+1); 子结点出栈 } } }
DFS示例
最小生成树(Minimum Spanning ) Tree
V0
V1
51
V2
V3
3
42
V4
V5
Kruskal思想:
—最小生成树篇
1.将边按边树由小到大排序。 2.每次加最小边 && 不构成回路。 3.加进了n-1条边就得到了最小生成树
//Kruskal算法并不保证每步生成的结果是连通的 (中间结果可能不是树)。
Kruskal程序基本结构:
优先队列+并查集
//该算法步步为营,每步生成的结果均为最终结果的 一部分。它每次从连接V’与(V-V’)的边中选最小边, 所选出的不一定是所有尚未选出的属于最小生成树 的边中的最小者。时间复杂度:O(ElgV)
Prime程序基本结构
无向连通图,初始时u只包 含1个点,后一步步将v中
void Prim() {
的点添加到u中来。
}
}
}
Prim示例:
U={v0}
V0
V1
V2
V3
V4
V5
U={v0,v2,v5,v3}
V1 V4
V0
1
V2
V3
42
V5
U={v0,v2}
V0
1
V1
V3
V2
V4
V5
U={v0,v2,v5,v3,v1}
V0
V1 5 1
V3
V2
42
V4
V5
U={v0,v2,v5}
V0
1
V1
V2
V3
4
V4
V5
U={v0,v2,v5,v3,v1,v4}
3.若此时图中还有未被访问到的顶点,则再选择其 中之一作为v0重复上述过程。直到图中所有顶点均 被访问到。
//搜索过程没有回溯,是一种牺牲空间换取时间的方 法。时间复杂度:O(V+E)
BFS程序基本结构
定义一个队列; 起始点加入队列; while(队列不空){
取出队头结点; 若它是所求的目标状态,跳出循环; 否则,从它扩展出子结点,全都添加到队尾; } 若循环中找到目标,输出结果; 否则输出无解;
k=j;
}
closest[k]=0;//k归入u中
for(j=2;j<=n;j++)
if(closest[j]&&c[k][j]<lowcost[j]&&c[k][j]>0) {
lowcost[j]=c[k][j];
//以k点为起点进行新一轮的代价计算,更新lowcost[]和closest[]
closest[j]=k;
}
起点到i点的最小代价
for(i=2;i<=n;i++) {
百度文库
c[i][j] 顶点i到j的权(i到j
min=maxcost;//maxcost一个很大的数
无边,则令c[i][j]=-1),
for(j=2;ijf<(c=lons;je+smt+[i)jn]&=&lolwowcocsots[tj[]j;]/</在mivn中&找&l到ow共 顶最c小有点os的从nt[个代j1]>价顶开0点点始) k{计(该) 模板中,
ACM/ICPC程序设计
简单算法
图论-算法
图的遍历 BFS(广搜) DFS(深搜)
最小生成树 Prim Kruskal
最短路径 Bellman-Ford Dijkstra Floyd-Warshall
BFS练习 DFS练习
Prim练习 Kruskal练习
Bellman-Ford练习 Dijkstra练习 Floyd-Warshall练习
BFS示例:
DFS思想
—遍历篇
1.将图G中每个顶点标记为未被访问,选取一个顶 点v作为搜索起点,标记其为已访问
2.递归地深搜v的每个未被访问过的邻接顶点,直到 从v出发所有可达的顶点都已被访问过。
3.若此时图中还有未被访问到的顶点,则再选择其 中之一作为v重复上述过程。直到图中所有顶点均被 访问到。
容易想到,用贪心策略。 Prim Kruskal
Prim思想
—最小生成树篇
1.从V中任取一结点放入V'; 2.在所有的端点分别在(V-V')和V'中的边中,选一条
权最小的加入E'; 3.将边E'在(V-V')中的顶点从V中取出放入V'; 4.重复步骤2~3,直到V'与V相等为止。
int i,j,k,min,lowcost[vex],closest[vex];
for(i=2;i<=n;i++) { lowcost[i]=c[1][i];//第1个点到其他点的代价
用closest[i]=0表示i点在
closest[i]=1;//初始时,所有点的起点都是点1 u集合中, lowcost[i]当前
算法实现要点: 用并查集的相关操作:实现集合的并;判断 新边的两端点是否处于同一集合,来确定是否构成回路。
最短路径 (Shortest Path):
最短路径问题:如果从图中某一顶点(称为源点) 到达另一顶点(称为终点)的路径可能不止一条, 如何找到一条路径使得沿此路径上各边上的权值 总和达到最小。
图的遍历
遍历要访问到图中的每一个顶点。 BFS (Breadth-First Search) DFS (Depth-First Search)
BFS思想
—遍历篇
1.从图中某顶点v0出发,在访问了v0之后,搜索v0 的(所有未被访问的)邻接顶点v1.v2…
2.依次从这些邻接顶点出发,广搜图中其它顶点, 直至图中所有已被访问的顶点的邻接顶点都被访问 到。
Kruscal 示例:
• 实例的执行过程
1
6
5 1
25 35 4
3
6
4
2
566
1
1
5
25
5
3
4
3
5
4
2
6
1、初始连通分量:{1},{2},{3},{4},{5},{6} 2、反复执行添加、放弃动作。条件:边数不等于 n-1时
边 动作 连通分量 (1,3) 添加 {1,3},{4},{5},{6},{2} (4,6) 添加 {1,3},{4, 6},{2},{5} (2,5) 添加 {1,3},{4, 6},{2,5} (3,6) 添加 {1,3,4, 6},{2,5} (1,4) 放弃 因构成回路 (3,4) 放弃 因构成回路 (2,3) 添加 {1,3,4,5,6,2}
//时间复杂度:O(V+E)
DFS程序基本结构
void DFS(int step) {
for(i=0; i<Max_Elements; i++) {
if(子结点符合条件) {
新子结点入栈; if(是目标结点)
输出 else
DFS(step+1); 子结点出栈 } } }
DFS示例
最小生成树(Minimum Spanning ) Tree
V0
V1
51
V2
V3
3
42
V4
V5
Kruskal思想:
—最小生成树篇
1.将边按边树由小到大排序。 2.每次加最小边 && 不构成回路。 3.加进了n-1条边就得到了最小生成树
//Kruskal算法并不保证每步生成的结果是连通的 (中间结果可能不是树)。
Kruskal程序基本结构:
优先队列+并查集
//该算法步步为营,每步生成的结果均为最终结果的 一部分。它每次从连接V’与(V-V’)的边中选最小边, 所选出的不一定是所有尚未选出的属于最小生成树 的边中的最小者。时间复杂度:O(ElgV)
Prime程序基本结构
无向连通图,初始时u只包 含1个点,后一步步将v中
void Prim() {
的点添加到u中来。
}
}
}
Prim示例:
U={v0}
V0
V1
V2
V3
V4
V5
U={v0,v2,v5,v3}
V1 V4
V0
1
V2
V3
42
V5
U={v0,v2}
V0
1
V1
V3
V2
V4
V5
U={v0,v2,v5,v3,v1}
V0
V1 5 1
V3
V2
42
V4
V5
U={v0,v2,v5}
V0
1
V1
V2
V3
4
V4
V5
U={v0,v2,v5,v3,v1,v4}
3.若此时图中还有未被访问到的顶点,则再选择其 中之一作为v0重复上述过程。直到图中所有顶点均 被访问到。
//搜索过程没有回溯,是一种牺牲空间换取时间的方 法。时间复杂度:O(V+E)
BFS程序基本结构
定义一个队列; 起始点加入队列; while(队列不空){
取出队头结点; 若它是所求的目标状态,跳出循环; 否则,从它扩展出子结点,全都添加到队尾; } 若循环中找到目标,输出结果; 否则输出无解;
k=j;
}
closest[k]=0;//k归入u中
for(j=2;j<=n;j++)
if(closest[j]&&c[k][j]<lowcost[j]&&c[k][j]>0) {
lowcost[j]=c[k][j];
//以k点为起点进行新一轮的代价计算,更新lowcost[]和closest[]
closest[j]=k;
}
起点到i点的最小代价
for(i=2;i<=n;i++) {
百度文库
c[i][j] 顶点i到j的权(i到j
min=maxcost;//maxcost一个很大的数
无边,则令c[i][j]=-1),
for(j=2;ijf<(c=lons;je+smt+[i)jn]&=&lolwowcocsots[tj[]j;]/</在mivn中&找&l到ow共 顶最c小有点os的从nt[个代j1]>价顶开0点点始) k{计(该) 模板中,
ACM/ICPC程序设计
简单算法
图论-算法
图的遍历 BFS(广搜) DFS(深搜)
最小生成树 Prim Kruskal
最短路径 Bellman-Ford Dijkstra Floyd-Warshall
BFS练习 DFS练习
Prim练习 Kruskal练习
Bellman-Ford练习 Dijkstra练习 Floyd-Warshall练习
BFS示例:
DFS思想
—遍历篇
1.将图G中每个顶点标记为未被访问,选取一个顶 点v作为搜索起点,标记其为已访问
2.递归地深搜v的每个未被访问过的邻接顶点,直到 从v出发所有可达的顶点都已被访问过。
3.若此时图中还有未被访问到的顶点,则再选择其 中之一作为v重复上述过程。直到图中所有顶点均被 访问到。