强连通
lp_opai
我没有时间写一封简短的信,所以我写了一封长的。
展开
-
hdu Exploration (并查集 拓扑 强连通)
首先对于所有的无向边,我们使用并查集将两边的点并起来 若一条边未合并之前,两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为这两个点处于同一个并查集集合中,那么它们之间至少存在一条路径) 如果上一步没有判断出环,那么仅靠无向边是找不到环的 考虑到,处于同一个并查集集合中的点之间必定存在一条路径互达,因此将一个集合的点合并之后,原问题等价于在新生成的有向图中是否有环 我们知道,有向无环图必原创 2015-05-07 20:36:49 · 381 阅读 · 0 评论 -
树的直径 (树上的最长路)
树的直径(Diameter)是指树上的最长简单路。 直径的求法:两遍BFS (or DFS) 任选一点u为起点,对树进行BFS遍历,找出离u最远的点v 以v为起点,再进行BFS遍历,找出离v最远的点w。则v到w的路径长度即为树的直径 *简单证明 于是原问题可以在O(E)时间内求出 关键在于证明第一次遍历的正确性,也就是对于任意点u,距离它最远的点v一定是最长路的一端。 如果u在最转载 2015-05-02 09:25:52 · 871 阅读 · 0 评论 -
hdu Proving Equivalences (强连通缩点)
/* 给你一个有向网络图,问,至少加多少条边能使这个图成强连通 思路:可以用tarjan算法求出求出有向图的强连通分量,并进行染色,然后在缩点,缩点的好处就是把原本杂乱的有向图变成有向无环图。。。 然后统计入度为0的点和出度为0的点,取其较大值就是所求的要求添加的最少的边的条数了。 */ # include # include # include # include #include原创 2015-05-09 16:00:24 · 383 阅读 · 0 评论 -
hdu1269 迷宫城堡 (强连通模板)(有向图)
///题意当强连通分量为1的时候输出Yes否者输出No。 两两可达 # include # include # include # include # include using namespace std; # define MAXN 10005 ///题目中可能的最大点数 # define MAXM 100005 ///边数 struct Edge { int v,next; } ed原创 2015-05-01 20:59:55 · 388 阅读 · 0 评论 -
hdu 4635 Strongly connected (强连通缩点)
/*题意: 给你一个有向图,问你最多能添加多少条边使得这个图依然不是强联通的。 做法: 1,求出图中的所有强连通分量 2,把上述的强连通分量缩成一个点。 3,问题现在变成问一个完全图,最少需要去除多少条边使得这个图不强联通, 那么肯定是去除所有强联通分量中含有点数最少的点的所有进边。 */ # include # include # include # include #includ原创 2015-07-30 19:38:25 · 354 阅读 · 0 评论 -
hdu 5438 Ponds(强连通)
/* 拓扑+强联通 题意: 有n个池塘 m条管道连接 把连接管道小于2的池塘删掉 剩下的连通分量为奇数的池塘相加为多少 先拓扑删边+强连通判断奇偶 */ # include # include # include # include # include # include using namespace std; const int MAXN = 20原创 2015-09-13 18:25:41 · 481 阅读 · 0 评论