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

解法:

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

  呵呵 这个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. junit测试时,出现java.lang.IllegalStateException: Failed to load ApplicationContext

    课程设计要求进行junit测试,我是在已经做好的ssh项目上做的测试,测试类代码如下 package com.zhang.web.services; import static org.junit.A ...

  2. 浅谈Jquery的使用上篇

    一. 1.Jquery是什么?有什么特性? jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML 元素选取.HTML 元素操作. CSS 操作 .HTML 事 ...

  3. Cocos2d-x串算出Size方法

    项目需要,根据所输入的字符串,的需要计算串帐户Size. 包代码如下面.只需要传递一个字符串,您可以返回Size: Size ChartDemoScene::calculateFontSize(con ...

  4. 完整导出IntelliJ IDEA的快捷键

    工欲善其事,必先利其器. 常常和代码打交道的人,熟练使用IDE快捷键那是必须的,由于快捷键能够把你从各种罗嗦事中解放出来.比方,假设没有快捷键,你就须要常常性的暂停快速执行的大脑,右手凭记忆摸到鼠标, ...

  5. 关于windows系统影子账户的问题

    在这之前,需要大家了解几个问题,一个是SID,一个是账号的F值. Windows账户的SID 在Windows系统中,系统会为每个用户账户建立一个唯一的安全标识符(Security Identifie ...

  6. 使用cacti监控服务器

    一.cacti安装 cacti需要lamp环境,因此需要首先编译安装lamp环境,安装完成后,下载cacti的zip包,解压到/www/htdocs目录下,创建cacti需要的数据库. 完成上述后,在 ...

  7. CentOS 7 命令备忘录

    1 查看目录下有什么文件/目录 >ls //list 列出目录文件信息 >ls -l 或ll //以“详细信息”查看目录文件 >ls -a //-all 查看目录“全部”(包含隐藏文 ...

  8. String数组必须初始化之后才能赋值

    犯了一个很大的错误: String sample[]=null; sample[]="hello"; samlple[]="world"; 直接就报异常了. 记 ...

  9. dell N5010

    Inspiron N5010Microsoft Windows 10 企业版 (64位) (英特尔)Intel(R) Core(TM) i3 CPU       M 370  @ 2.40GHz(24 ...

  10. extjs_11_mvc模式

    1.非mvc模式 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/fill/I ...