摘要: 题目大意给了 n(2<=n<=105) 个点,从每个点 u 出发连向了一个点 v(共 n 条边)现在要求添加最少的边使得整个图是一个强连通图做法分析这道题千万不要一般化:先求强连通分量再把图化为 DAG 来做(我们能够很方便的得到需要添加的边的数量,但是加哪些边会变得很麻烦)注意一个细节:每个点的出度必为 1有什么特点? 从一个点 u 出发 DFS 遍历所有能够遍历到的点,DFS 结束的时候必定得到一个环!而且,因为每个点的出度为 1,所有遍历到的点只能形成一个环!而且这个环还是在路径的结尾,如果把这个换缩成一个点,那么我们等够得到的是一个“倒着长”的树(只存在从叶子节点到树根的节 阅读全文
posted @ 2013-04-21 21:49 jianzhang.zj 阅读(373) 评论(0) 推荐(0) 编辑
摘要: 题目大意在 x 轴上,有 n(1<=n<=1000) 个线段,用最少的钉子把所有的线段钉住,输出这些钉子的坐标做法分析贪心先把所有的线段按照起点由小到大排序,起点相同的按照终点由大到小排序然后直接线性的扫一遍:不断的缩小钉子所在的区间,知道添加一条线段后,钉子所在的区间消失为止,然后,前面的所有的线段用一个钉子钉住,再接着往下扫,直到扫完了所有的线段参考代码D. Segments 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <vector 阅读全文
posted @ 2013-04-21 20:14 jianzhang.zj 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 题目大意给了 n 个节点以及一个特殊的顶点 v(3<=n<=105),让你用 m(0<=m<=105) 条边建一个无向图,使得这个图以 v 为它的一个割点做法分析无向图中,一个割点同时属于两个点双连通分量我们可以这样做,假设割点的一边是连通的(不一定是双连通),里面点的个数设为 x(不包括割点 v),割点的另一边也是连通的,里面点的个数肯定是 n-x-1(不包括割点)那么,两边中,边的总数最多是 C2x+1+C2n-x=x2+(1-n)*x+(n2-n)/2注意:这是一个凹函数,对称轴是 x=(n-1)/2,且 x 的取值范围是 [1, n-2] 中的整数,要使函数取最 阅读全文
posted @ 2013-04-21 20:03 jianzhang.zj 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 题目大意给了一个无向图,n(2<=n<=1000) 个节点 n-1 条边,每天拆一条边并新建一条边,最终使得所有的顶点连通(其实形成一棵树)问:最少需要几天,并且输出每天拆掉的边和新建的边做法分析首先,我们可以把每条边存下来,然后利用 DFS,遍历所有的顶点一遍,遍历的过程中,经过的边就是树边(也就是所有的不拆掉的边),剩下的所有边统统要拆掉利用并查集,把每个连通块用一个点代表,并统计这个连通快中需要删掉的边的个数(DFS过程中没有遍历到的边的个数)这里,我们需要注意到这样一个性质:只有 n-1 条边,那么,图中肯定存在一个联通快,它是一棵树或者一个孤立的节点最少需要的天数肯定是不 阅读全文
posted @ 2013-04-21 19:34 jianzhang.zj 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 题目大意给了一个 n(2<=n<=300) 个节点的无向图,告诉了每两个节点之间的最短距离,现在要新建 K(1<=K<=300) 条边要求:每建一条边,输出任意两个点之间最短的距离的和做法分析首先,如果直接暴力的话肯定 T(因为是 o(n4) 的时间复杂度)我们需要注意的是,每次只是新建一条边令 g[i][j] 表示顶点 i 和顶点 j 之间的最短距离假设新建的边是 a---b 边权为 c如果 g[a][b]<=c 那么,新建的边不会用来更新多有顶点之间的最短距离,这时候直接统计最短距离和输出就行,下面讨论 g[a][b]>c 的情况 首先 g[a][b]= 阅读全文
posted @ 2013-04-21 19:17 jianzhang.zj 阅读(184) 评论(0) 推荐(0) 编辑