题目意思:给一棵树,找到俩个不相交的通路,使得这俩个通路的长度和乘机最大;

解法:

  小哥一看呵呵 这不就是枚举点 然后求俩边的树的直径在相乘求个最大值的题么!

  呵呵 这个N 有100000 当时就不玩了;

  学长指导了下我;

  俺会了!/灯泡

  在枚举点在书的直径上时点的左右的最长的链无非这几种情况如图(红色是树得直径)(蓝色和绿色是俩种情况)

  无非就 蓝色和绿色这个俩种,所以这个答案和直径有很大的关系!

不在直径上时:一边肯定是直径了另一半呢?如图;

  解的过程:

    1: 想求出直径的点顺序的 存在一个数组内;

    2: 求出和每个直径上节点相邻的  最大和次大 和直径不相连的  链的 长度  并求出Max(这个链的点都不在直径上)

    3:O(n)枚举点并求出这个点的左右的长度最值

    4:由3的结果求出最大的ANS ,在和树得直径*Max取最值

  over:

代码

#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int INF=0x7fffffff;
const int maxn=;
struct Edge
{
int to,pre;
Edge (int to=,int pre=):to(to),pre(pre){}
};
Edge edge[maxn*];
int head[maxn],pos;
bool vis[maxn];
bool in_line[maxn];
int ko[maxn],pos_ko;
int dp[maxn][];
int dp1[maxn],dp2[maxn];
struct info
{
int p,pre;
};
info que[maxn];
void inint()
{
memset(head,-,sizeof(head));
pos=pos_ko=;
memset(dp,,sizeof(dp));
memset(in_line,false,sizeof(in_line));
memset(dp1,,sizeof(dp1));
memset(dp2,,sizeof(dp2));
}
void add_edge(int s,int to)
{
edge[pos]=Edge(to,head[s]);
head[s]=pos++;
}
void make(int P)
{
if(que[P].pre!=-)make(que[P].pre);
ko[pos_ko++]=que[P].p;
in_line[que[P].p]=true;
}
int bfs(int t,bool flag)
{
memset(vis,false,sizeof(vis));
int h=,r=;
que[].p=t;
que[].pre=-;
vis[t]=true;
int x;
while(h<r)
{
x=que[h++].p;
for(int i=head[x];~i;i=edge[i].pre)
{
Edge &tmp=edge[i];
if(!vis[tmp.to])
que[r].p=tmp.to,
que[r++].pre=h-,
vis[tmp.to]=true;
}
}
if(flag)make(r-);
return que[r-].p;
}
void get_it(int key,int t)
{
if(key>dp[t][])dp[t][]=dp[t][],
dp[t][]=key;
else if(key>dp[t][])
dp[t][]=key;
}
int Max;
int dfs(int pa,int &s,int &t)
{
int key,ans=;
for(int w=head[s];~w;w=edge[w].pre)
{
Edge &tmp=edge[w];
if(tmp.to==pa||in_line[tmp.to])continue;
key=dfs(s,tmp.to,t);
if(pa==-) get_it(key,t);
if(pa!=-)
{
if(ans)
Max=max(Max,ans-+key);
else
Max=max(Max,key);
}
ans=max(ans,key+);
}
if(pa==-)Max=max(Max,ans-);
return ans==?:ans;
}
void solve(int &n)
{ long long ans=;
Max=;
int p1=bfs(,false),p2=bfs(p1,true);
int Max1;
for(int i=;i<pos_ko;i++)
dfs(-,ko[i],i);
ans=(pos_ko-)*Max;
--pos_ko;
for(int i=;i<pos_ko;i++)
{
dp1[i]=max(dp1[i-],i+dp[i][]);
dp1[i]=max(dp1[i],dp[i][]+dp[i][]);
}
for(int i=pos_ko-;i>=;i--)
{
dp2[i]=max(dp2[i+],pos_ko-i+dp[i][]);
dp2[i]=max(dp2[i],dp[i][]+dp[i][]);
}
for(int i=;i<pos_ko;i++)
ans=max(ans,(long long)dp1[i]*dp2[i+]);
ans=max(ans,(long long ));
printf("%lld\n",ans);
}
int main()
{
int n;
int a,b;
while(~scanf("%d",&n))
{
inint();
for(int i=;i<=n;i++)
{
scanf("%d%d",&a,&b);
add_edge(a,b);
add_edge(b,a);
}
solve(n);
}
return ;
}

SPOJ TWOPATHS Two Paths的更多相关文章

  1. SPOJ Two Paths

    Description 给定一个无向图,含有一定的路.从中找出两个最长的路径(每条路径有一些相通路组成)这两个路径不能经过公共的点,求何时二路径的乘积最大. 本题给出的无向图是一棵树,每边权值为1. ...

  2. BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 5217  Solved: 1233 ...

  3. [LeetCode] Binary Tree Paths 二叉树路径

    Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...

  4. [LeetCode] Unique Paths II 不同的路径之二

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  5. [LeetCode] Unique Paths 不同的路径

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  6. SPOJ DQUERY D-query(主席树)

    题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...

  7. leetcode : Binary Tree Paths

    Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...

  8. SPOJ GSS3 Can you answer these queries III[线段树]

    SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...

  9. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

随机推荐

  1. [Android学习笔记]双缓冲绘图技术

    双缓冲技术绘图: 什么情况下产生的双缓冲技术?当数据量很大时,绘图可能需要花费很长的时间,这样屏幕就会出现卡顿,闪烁等现象. 什么是双缓冲技术?双缓冲是在内存中创建一个与屏幕绘制区域一致的对象,先将图 ...

  2. 7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml

     数据本地化 A CCUserDefault 系统会在默认路径cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下生成一个名为UserDef ...

  3. Python学习入门基础教程(learning Python)--5.3 Python写文件基础

    前边我们学习了一下Python下如何读取一个文件的基本操作,学会了read和readline两个函数,本节我们学习一下Python下写文件的基本操作方法. 这里仍然是举例来说明如何写文件.例子的功能是 ...

  4. jquery实现鼠标拖动

    <html>   <head>   <script type='text/javascript' src='js/jquery-1.5.1.js'></scr ...

  5. 杭电acm阶段之理工大版

    想參加全国软件设计大赛C/C++语言组的同学,假设前一篇<C和指针课后练习题总结>没看完的,请先看完而且依照上面的训练做完,然后做以下的训练. 传送门:http://blog.csdn.n ...

  6. 【WinRT】【译】【加工】在 XAML 中制作圆形图片

    原文:[WinRT][译][加工]在 XAML 中制作圆形图片 原文地址:http://timheuer.com/blog/archive/2015/05/06/making-circular-ima ...

  7. 苹果iOS手机系统诊断功能是后门吗?

    7月20日,美国知名苹果iOS手机系统侦破专家扎德尔斯基在2014年世界黑客大会(HOPE/X)用幻灯片讲演揭露了苹果手机存在系统级"后门". 为此,7月23日.苹果公司马上做出回 ...

  8. Codeforces Round #296 (Div. 1) E. Triangles 3000

    http://codeforces.com/contest/528/problem/E 先来吐槽一下,一直没机会进div 1, 马力不如当年, 这场题目都不是非常难,div 2 四道题都是水题! 题目 ...

  9. hdu3001(状压dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题意:n 个城市已经 m 条路 以及对应路费 c,要求遍历所有城市最少的路费,每个城市不能超过2 ...

  10. 3p

    哈,不要自卑.爱情和婚姻可遇不可求,缘到自然成.首要的是人好,容貌別太差,毕竟天天在一起看着要舒心才好,另外应该有上进心,避免势利小人.这些,都要看机缘.所谓right person at right ...