2013年5月21日
摘要: 题目链接。题意:给一张有向图G,求一个结点数最大的结点集,使得该结点中任意两个结点 u 和 v满足:要么 u 可以到达 v, 要么 v 可以到达 u(u 和 v 相互可达也可以)。分析:”同一个强连通分量中的点要么都选,要么不选。把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它的结点数,则题目转化为求SCC图上权最大的路径。由于SCC图是一个 DAG, 可以用动态规划求解。“注意:假设含有 n 个点的图中不含结点数大于 1 的强连通分量,那么缩点后的图含有 n 个点,由于 scc_cnt 是从 1 开始编号,所以初始化时要用<=n 而非 <n。for(int i=1; 阅读全文
posted @ 2013-05-21 21:18 Still_Raining 阅读(604) 评论(0) 推荐(0)
摘要: 题目链接。题意:至少增加几条边,才能让图强连通。分析:“首先,找出强连通分量,然后把每个强连通分量缩成一个点(缩点),得到一个DAG。 接下来,设有a个结点的入读为0, b个结点的出度为0, 则 max{a, b}就是答案。 注意特殊情况: 当原图已经强连通时, 答案是0而不是1."这是《算法竞赛入门经典——训练指南》上的原话。对于证明,搜了一下,没有找到。自己呢,试着画了一下,记下个人心得。自己的理解如下;一个含n个点的图,至少要有n条边,才能强连通。即每一个点至少都会有一个入度和出度。对于得到的DAG,设有a个结点的入度为0, b个结点的出度为0,因为增加一条边会同时增加一个入度 阅读全文
posted @ 2013-05-21 19:28 Still_Raining 阅读(808) 评论(0) 推荐(0)
摘要: 题目链接。题意:判断是否有向图是否强连通。分析:模板题。判断一个图是否为强连通,即用Tarjan算法看强连通分量(SCC)是否为1.#include <iostream>#include <vector>#include <stack>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int maxn = 10000+10;const int maxm = 100000+10;vector<int> 阅读全文
posted @ 2013-05-21 16:35 Still_Raining 阅读(224) 评论(0) 推荐(0)