SPOJ TWOPATHS Two Paths
题目意思:给一棵树,找到俩个不相交的通路,使得这俩个通路的长度和乘机最大;
解法:
小哥一看呵呵 这不就是枚举点 然后求俩边的树的直径在相乘求个最大值的题么!
呵呵 这个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的更多相关文章
- SPOJ Two Paths
Description 给定一个无向图,含有一定的路.从中找出两个最长的路径(每条路径有一些相通路组成)这两个路径不能经过公共的点,求何时二路径的乘积最大. 本题给出的无向图是一棵树,每边权值为1. ...
- 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 ...
- [LeetCode] Binary Tree Paths 二叉树路径
Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...
- [LeetCode] Unique Paths II 不同的路径之二
Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...
- [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 ...
- SPOJ DQUERY D-query(主席树)
题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...
- leetcode : Binary Tree Paths
Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...
- 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 ...
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
随机推荐
- poj 2409+2154+2888(Burnside定理)
三道burnside入门题: Burnside定理主要理解置换群置换后每种不动点的个数,然后n种不动点的染色数总和/n为answer. 对于旋转,旋转i个时不动点为gcd(n,i). 传送门:poj ...
- 明晚8点,捷微团队QQ群公开课,解说jeewx2.0版本号maven环境的搭建入门!
2014-08-13号晚8点,捷微团队QQ群公开课,解说jeewx2.0版本号maven环境的搭建入门! 讲师:刘强(团队成员) QQ群:287090836 (JAVA版本号微信开源项目) http: ...
- 2014年百度之星程序设计大赛 - 资格赛 第二题 Disk Schedule
双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1和北京大学OJ2677都出现了这个题目. 旅行商问题描写叙述:平面上n个点,确定一条连接各点的最短闭合旅程 ...
- IOS-UITextField-邮箱后缀联想赛
最近做的项目,有一个函数,百度了一下 结果没 要研究了一下. 当用户输入邮箱形式的账号时,输入完"@"符号后.联想出经常使用的邮箱 点击某一行,将改行代表邮箱自己主动输入到账号输入 ...
- 沙朗javascript总结一下(一)---基础知识
我也听说过Javascript这东西.我一直感觉很神奇,但它并没有去太懂.今天,牛腩哥哥随后的初步研究,一些浅显的认识.就先总结一下. 首先,什么是javascript? javascript是一种直 ...
- cocos项目导入其它源文件时加入依赖库时,头文件提示找不到文件夹中的文件
cocos项目导入其它源文件时加入依赖库时,头文件提示找不到文件夹中的文件解决方法: 选择项目属性->c/c++->常规,在附加包括项目中加上对应的文件夹 cocos test项目的库(所 ...
- iOS 同步GET
(注意: 能够整片复制)
- Java程序猿学习当中各个阶段的建议
回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议 引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的 ...
- SharePoint 2013的HTML5特性之响应式布局
今天偶然看到一本书<Pro SharePoint 2013 Branding and Responsive Web Development>,看到SharePoint 2013基于HTML ...
- 获取Google音乐的具体信息(方便对Google音乐批量下载)
Google音乐都是正版音乐, 不像百度所有都是盗链, 并且死链也多. 但有一个麻烦就是要下载Google音乐的时候得一个一个的点击下载链接, 进入下载页面再点"下载", 才干下载 ...