题目地址:SDUT OJ 3045
这题比赛的时候想的差不多。。但是总是觉得不对。。写了一次就没再写,然后删了。。当时没想到的是第二次求出来的就是最长链。。当时想到的两次bfs找最大值(这一种方法其实结果也对。。TAT。。),还有找到点后在回溯减去重点等等。。但总觉得好像都不太对。。。赛后才知道这题原来是树的直径。。。。。牡丹江区域现场赛的时候遇到过,不过赛后也没看。。。
找树的直径的方法其实...
分类:
其他好文 时间:
2014-12-06 22:54:08
阅读次数:
227
题意:戳这里思路:很明显是一个图论模型。。 就两种图形: 1、图中存在环,那么就是所有环的gcd为最大答案。gcd的大于3的最小约数为最小答案 2、不存在环,那么是每个弱连通块的最长链之和为最大答案,最小答案为3。。 但是这一题最关键的是实现,实现技巧太赞了。。 首...
分类:
其他好文 时间:
2014-11-02 00:35:49
阅读次数:
232
vijos1107环游大同80天学习了一下求树的最长链的方法最简单的思路就是两次dfs两次dfs分别有什么用呢?第一次dfs,求出某个任意的点能到达的最远的点第二次dfs,从所搜到的最远的点倒搜回去.为什么需要两次呢?其实很容易想通第一遍dfs的起始点或许并不是最长链的起点从最远的点倒搜到的最长的链...
分类:
其他好文 时间:
2014-09-19 01:06:24
阅读次数:
265
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1093分析:首先肯定是先把强联通全部缩成一个点,然后成了一个DAG下面要知道一点:原图的最大半联通子图实际是上是新DAG图的一个最长链然后就像拓扑排序一样(不过这是以出度为0的点优先,拓扑...
分类:
移动开发 时间:
2014-08-31 13:13:01
阅读次数:
251
2次dfs的方法: 1 void dfs(int u,int step) 2 { 3 int tmp=0; 4 if (step>t) 5 { 6 max_dist=step; 7 max_point=u; 8 } 9 for ...
分类:
其他好文 时间:
2014-08-28 22:22:26
阅读次数:
212
一开始我还天真的一遍DFS求出最长链以为就可以了不过发现存在有向环,即强连通分量SCC,有向环里的每个点都是可比的,都要分别给个集合才行,最后应该把这些强连通分量缩成一个点,最后保证图里是 有向无环图才行,这个时候再找最长链,当然缩点之后的scc是有权值的,不能只看成1,缩点完了之后,用记忆化搜索D...
分类:
其他好文 时间:
2014-08-10 18:17:30
阅读次数:
199
题目链接:点击打开链接
题意:给定一棵树
找2条点不重复的路径,使得两路径的长度乘积最大
思路:
1、为了保证点不重复,在图中删去一条边,枚举这条删边
2、这样得到了2个树,在各自的树中找最长链,即树的直径,然后相乘即可
#include
#include
#include
#include
#include
#include
#include
#include
#include
#i...
分类:
其他好文 时间:
2014-06-30 07:30:01
阅读次数:
235
首先双连通缩点建立新图(顺带求原图的总的桥数,其实由于原图是一个强连通图,所以桥就等于缩点后的边)
此时得到的图类似树结构,对于新图求一次直径,也就是最长链。
我们新建的边就一定是连接这条最长链的首尾,这样就将原图的桥减少了直径个。
#include
#include
#include
#include
#include
#include
using namespace std;
#...
分类:
其他好文 时间:
2014-06-28 07:18:36
阅读次数:
278
首先对于一棵树我们可以tree_dp来解决这个问题,那么对于环上每个点为根的树我们可以求出这个树的一端为根的最长链,并且在tree_dp的过程中更新答案。那么我们对于环,从某个点断开,破环为链,然后再用DP来解决这个问题。
备注:很久之前的一道题,刚转的c++,然后T了,也懒得改了。/****...
分类:
其他好文 时间:
2014-05-07 20:58:09
阅读次数:
546
题意:输出从一颗树中所有结点出发可以走的最长的路。思路:先找到树上最长链然后判断两个端点中到每个结点远的距离就是答案。代码如下:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include
8...
分类:
其他好文 时间:
2014-05-02 08:55:38
阅读次数:
192