基本概念
关节点(割顶):对于无向图G,如果删除某个点u后,连通分量数目增加,则称u为图的关节点
桥:若删除某条边e后,连通分量增加,则称e为图的桥
DFS森林中的边称为树边,第一次处理时从后代指向祖先的边称为反向边
深度优先序(时间戳):dfs搜索过程中,按访问次序给顶点标记的编号
基本思想
在无向连通图G的DFS树中:
割顶
1)根结点u是G的割顶当且仅当u至少有两个子孩子
2)非根结点u是G的割顶当且仅当u存在一个子结点v,
使得v及其所有的后代都没有反向边连回到u的祖先(连回u不算)。
设dfn(u)为结点u的深度优先序,low(u)为u及其后代能连回的最早祖先的dfn值
若dfs搜索中u在v前先被访问,则dfn(u)=dfn(u)
桥
无向边(u,v)是图G的桥,当且仅当(u,v)为树边,且满足low(v)>dfn(u)
强连通分量SCC
从u的子结点出发,可以到达u的祖先w,则u,v,w在同一个SCC,则u不是该SCC第一个被发现的点
如果从v发现最多只能到u,那么u是该SCC中第一个被发现的点。即low(u)=dfn(u)时满足
HDU 1269 迷宫城堡
链接
题意
判断有向图G是否为强连通图
分析
求出强连通分量数,若个数大于1,则图G不是强连通图
参考代码
1 | #include<stdio.h> |
HDU 1827 Summer Holiday
链接
题意
Wiskey有一个消息想告诉大家(N个人),他知道其他人也有一些别人的联系方式,
这样他可以通知其他人,再让其他人帮忙通知一下别人。已知M组联系关系,
问Wiskey至少要通知几个人才能使得所有人都被通知到?
分析
求强连通分量缩点后,计算有多少个入度为零的点(不能被其他人通知到)即为答案
参考代码
1 | #include<stdio.h> |
POJ 1827 SPF
链接
题意
对于一个连通的网络,如果一个结点出现故障,将阻止至少一对结点之间的通信,
则该结点是SPF结点。给定一个网络,求有多少个SPF结点
分析
SPF点即为关节点,求有多少个关节点即可
参考代码
1 | #include<stdio.h> |
POJ 2186 Popular Cows
链接
题意
有N头牛,M组关系A B,表示A认为B更受欢迎。若A认为B更受欢迎,B认为C更受欢迎,
则A也认为C更受欢迎。求有多少头牛被其他所有(N-1头)牛认为更受欢迎
分析
先计算强连通分量缩点,再求有多少点的出度为0,若出度为0的点大于1,则答案为0,
否则答案为出度为0的强连通分量中点的个数
参考代码
1 | #include<stdio.h> |
POJ 2762 Going from u to v or from v to u?
链接
Going from u to v or from v to u?
题意
判断一个有向图是否为弱连通图
分析
求出强连通分量并缩点,记录每个点(连通分量)的入度,进行拓扑排序,
若每次仅存在一个入度为0的点,则为弱连通图
参考代码
1 | #include<stdio.h> |