连通分量
#pragma comment(linker, "/STACK:102400000,102400000") 手动加栈
强连通分量:有向图中两两可达的子图,即环
无向图:
割点:就是删掉这个点之后连通分量增加,
桥:删除这条边后连通分量增加。
边双连通分量:无向图中两两可达的子图,及环。
https://cn.vjudge.net/contest/287581#problem/B 题目链接
A题: 对于有向图,求存不存在一个点可以被其他所有点可达:
首先缩点成为一个有向无环图,对于每个强联通分量(在有向无环图中就是一个点)计算他们的出度,如果要满足要求,应该只有一个强联通分量的出度等于零,所以就是看是否只存在一个点的出度为零。
B题:对于有向图,求至少需要在几个点放病毒可以是其他点都感染病毒,然后计算至少要加几条边才能使得随便把病毒给那个点都可以使所有点感染病毒:
首先锁典成为一个有向无环图,计算出度为零的点就是第一问,第二问是求入度为零的点与出度为零的点的个数的最大值。
求树的直径,即树上最长的一条链,记录深度数组,先随便找一个点,找到离他最远的一个点,然后把深度数组归零,从这个点在找一个离他最远的一个点,那个点的深度即为树的直径。