【暑假】[ 图论 ] MST、最短路总结

来源:互联网 发布:联通大数据宣传片 编辑:程序博客网 时间:2024/05/16 02:12
                [ 图论 ]  MST、最短路总结

11.1 再谈树
算法:
1、无根树转化为有根树:vector G[maxn]读入时建立双边关系 + DFS(root)梳理树关系【注意】if (v != fa) 否则引起无限递归
2、表达式->表达式树:寻找最后一步运算建立结点左右子树递归。寻找运算的方法(p,c1,c2)。【注意】return u; //返回结点标号
例题:
11-1 Common Subexpression Elimination
思路:根据string expr建立树关系, 通过递归计算得到结点的s,lch,rch信息,根据子树出现的次序标号结点(NC) ,并根据结点信息判重,如果重复则删除结点。返回结点标号。

11.2 最小生成树
算法:
Kruskal: sort_edge根据边的大小排序,不断贪心选择:如果向MST中加入当前最短边不会导致成环则加入(直到形成了n-1条边则切断循环MST形成)。
特点:edge[]{uvw} set_p

例题:
11-2 Slim Span
思路: Kruskal算法应用。枚举最短边L并形成最大边为R的MST,比较得到w[R]-w[L]最小的MST。Kruskal算法可以提供恰好形成MST时的最大边R。
11-3 Buy or Build
思路:一遍Kruskal计算得出不使用套餐情况下的n-1条边,枚举套餐使用情况,对于每一种情况只考虑MST-1中的n-1条边与因使用套餐而权值为0的边建立MST,比较费用选择最小的一种。
11.3最短路问题
算法:
Dijkstra:循环寻找当前点集可延伸的边中的最短边(n条),并以之更新其他相连边。
特点:d[] w[][] 。vis数组标记边是否已经用过。
SPFA:queue_Q优化下的Bellman_Ford算法。每次只利用Q中的结点更新相连结点,并将更新结点入队。避免了无用的更新。
特点:Q inq d[] w[][] inq数组标记是否入队,避免重复入队。
Floyd:枚举结点更新边。
特点:FOR_k FOR_i FOR_j

例题:
11-4 Calling Circles
思路:Floyd计算传递闭包g[][],g[i][j]表示i->可以间接或直接相连。重新构图,if(g[i][j] && g[j][i]) 则连边,注意边是单向的。 +DFS根据连通块输出。

 11-5  Audiophobia   思路:Floyd巧妙变形。d[i][j]=min(d[i][j],max(d[i][k],d[k][j]) 。   (真不明白是怎么想到的┑( ̄Д  ̄)┍) 11-6  It's not a Bug,It's a feature   思路:SPFA + 隐性图搜索+二进制运算。当SPFA算法需要更新其他相连点的时候“在线”枚举补丁如果满足贴补丁的要求则可连边(新旧结点判断返回标号 map int(状态)->int(id)),更新。

范围:《算法竞赛入门经典》P352—P366

1 0