算法笔记——图论其他

1、差分约束

差分约束系统指的是一个有M个约束条件的图,每一对点的权值有可能存在a[i] - a[j] < c 的约束关系, 要求我们求解出这样的一张图。对于这样的一种约束关系, 很像求单元最短路中的更新时的条件a[i] < a[j] + c。我们对于i 连一条向j权值为c的边, 如果是a[i] - a[j] > c 的约束关系, 可以把它乘-1.然后跑最短路, 如果出现负环, 则无解。

其实这非常的容易理解。如果一个点的值大于其他点对他的约束值, 那么它的值就更新为这个值, 显然这满足前面的约束关系。

在建图的时候, 可以加一个0号点,dis值为0, 対每一个点连一条边权为0的边,每一个点的dis值为即为该图的解。

2.强联通分量

强联通分量大家都会:从根节点向下dfs, 如果遇到返祖边,就更新其low值。以前一直困扰我的是在更新时的这样一句:

if(dfn[y]) if(instuck[y]) low[x] = low(dfn[y], low[x]); instuck表示这个点还在栈中。517大仙给出了解答。对于一个有向图,生成一颗dfs树之后, 存在树边, 前向边, 横叉边这三种边, 我们的tarjan算法其他部分处理了树边与 前向边, 对于一条横叉边, 当前节点可以到达一个已经发现的点中。 如果这个点已经退栈,则表示这个点已经不可能到达其他非其联通分量中的点了。否则, 它存在于这个强联通分量中。

3.堆优化的dij

每次更新时,把其点的距离与编号pair一下放进堆里,堆里可能会有多个同一点的元素。我们取出堆顶的时候,如果当前的dis值小于堆中的值,就不取。时间复杂度mlogm。517说能用此算法就不用spfa。

4.双联通分量与割点割边

双联通分量不用判横插边, 因为是双向的, 横插边一定会被前面的搜索时扫到;

扫描二维码关注公众号,回复: 2345578 查看本文章

割边 low[x] == dfn[x] x - x+1

割点 low[x] >= dfn[x] root如果有两个节点则为割点



猜你喜欢

转载自blog.csdn.net/gjc2561571372/article/details/81056667