DFS与强联通分量(strong connected component-Sccs)

今天我们来聊一下DFS计算有向图的强联通分量Sccs。

老规矩,首先给出Sccs的定义。Sccs是一些节点的集合,该集合中任意两个节点u,v,存在路径u到v,同时也存在路径v到u。

我们来看一个示意图

 我们看,a点存在一个到b的路径,b可以通过e点到达a。因此a b e构成了一个Sccs。

那么我们如何求解一个图中的Sccs呢?

首先,我们将上图中的Sccs缩成一个点,来看看。

 我们可以看到,将Sccs缩成一个点之后,示意图变简单了不少。如果我们对简化过后的示意图来进行搜索的话,我们可以看到如果我们先搜索S1中的点,可能搜着搜着就到S2或者S3中了。反之如果我们先搜索S3中的点,则不会跑到S1或者S2中。这是一个非常重要的发现。而这个S3看起来是不是感觉很熟悉?是不是我们拓扑排序里面提到的sink node?但是拓扑排序不是使用在有向无环图中吗?是的,那是针对排序而言。这里,我们可以借助这个思想嘛。

收到sink node的启发,kosaraju算法主要就是考虑,先把图中的节点按照拓扑排序的思路先排一个顺序。同一个Sccs中的点由于形成一个环,因此他们之间顺序无所谓。但是Sccs本身的点需要有一个大的顺序。如S

好的,以下是代码形式的电话线路图状态: ``` @startuml title Telephone State Diagram [*] --> Idle : Initial State Idle --> Dialing : Off Hook Event Dialing --> Connecting : Valid Number Event Dialing --> Disconnected : Invalid/Wrong Number Event Connecting --> TimeOut : Timeout Event Connecting --> Connected : Called Phone Answers Event Ringing --> Connected : Called Phone Answers Event Connected --> Idle : On Hook Event Connected --> Busy Tone : Line Busy Event Connected --> TimeOut : Timeout Event Connected --> Disconnected : Timeout Event Connected --> Ringing : Play Message Event @enduml ``` 解释一下: - 初始状态为空闲状态(`[*] --> Idle : Initial State`)。 - 当电话机摘机时,电话状态从空闲状态转入拨号状态(`Idle --> Dialing : Off Hook Event`)。 - 当拨号有效号码时,电话状态从拨号状态转入连接状态(`Dialing --> Connecting : Valid Number Event`)。 - 当拨号号码无效或错误时,电话状态从拨号状态转入未连接状态(`Dialing --> Disconnected : Invalid/Wrong Number Event`)。 - 当连接超时时,电话连接状态从连接状态转入超时状态(`Connecting --> TimeOut : Timeout Event`)。 - 当被拨打的电话接听时,电话连接状态从连接状态或响铃状态转入已连接状态(`Connecting --> Connected : Called Phone Answers Event` 或 `Ringing --> Connected : Called Phone Answers Event`)。 - 当已连接状态的电话机挂机时,电话状态从已连接状态转入空闲状态(`Connected --> Idle : On Hook Event`)。 - 当已连接状态的电话线路忙碌时,电话状态从已连接状态转入忙音状态(`Connected --> Busy Tone : Line Busy Event`)。 - 当已连接状态的电话连接超时时,电话状态从已连接状态转入未连接状态(`Connected --> TimeOut : Timeout Event`)。 - 当已连接状态的电话播放信息时,电话状态从已连接状态转入响铃状态(`Connected --> Ringing : Play Message Event`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值