摘要: #include #include #include using namespace std; const int maxn = 105; int n; int vis[maxn], prime[maxn], phi[maxn]; void sieve(int n) { int m = (int) sqrt(n + 0.5); memset(vis, 0, siz... 阅读全文
posted @ 2017-11-02 21:58 yohanlong 阅读(146) 评论(0) 推荐(0) 编辑
摘要: 最短路树在本题的应用可以大大降低时间复杂度。 题意求去掉一条边后所有点对的最短路径和c的最大值。 常规思路是枚举边,对于每一条删掉的边,我们都求出此时的c,然后比较。 但是这也意味着我们对于删掉的每条边都要做N次最短路,承受不起。 我们发现,如果删掉的边不在当前起点的最短路树上,这删掉的边不会影响该 阅读全文
posted @ 2017-11-02 20:31 yohanlong 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 题意实际上是在原图中对于一条边(a,b)如果d[a] > d[b]则在新图中连b->a的一条边。 最后求有向图的路径总数。 用dp实现。 阅读全文
posted @ 2017-11-02 15:52 yohanlong 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 题意是给你一个无向图,让你求至少要放多少个太平井,使得图中任意一个点坏掉,在其它所有点的人都能通过安全井逃生。 显然先求出BCC(点双)。 显然把井放在割顶不合适,因为如果割顶挂了,这个放在割顶的井不能帮助任何人逃生。 然后对于一个BCC,如果它只有一个割顶,那么一定要在非割顶处放一口井,因为如果割 阅读全文
posted @ 2017-11-02 12:05 yohanlong 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 真正意义上由自己思维推断出的第一题。 实际上思路也和正解一致。 题意是给你一个有向图,让你求一个点集,使得点集中任意一对点对(u,v),要么u可以到v,要么v可以到u。 我们可以发现,对于一个SCC而言,要么都选,要么都不选(换句话说,如果我们选中了SCC中的任意一点,那么也可以顺便把SCC中的其他 阅读全文
posted @ 2017-11-02 09:48 yohanlong 阅读(99) 评论(0) 推荐(0) 编辑
摘要: 在求有向图的强连通分量的时候,有一个特别重要的东西要记住: 有向图和无向图的low函数的意义是不同的。 有向图中,low所指,只能连回当前scc中的点,这也决定了这一行: 判断scc是否已经找到的因素是,low[u] == dfn[u]这也意味着u是当前scc的第一个发现的点。 sccno初始化为0 阅读全文
posted @ 2017-11-02 08:47 yohanlong 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 点双和边双的区别我在上一篇文章中已经讨论过了,这篇文章讲边双的求法。 由于是边双,就决定了边双中一定不含有桥,但是可以含有割顶。 所以我们对边双唯一的限制条件就是不经过桥。 如此一来,我们可以分成两次dfs,第一次求出所有的桥,第二次dfs时遍历整张图,只要保证不经过桥就可以了。 阅读全文
posted @ 2017-11-02 08:21 yohanlong 阅读(165) 评论(0) 推荐(0) 编辑