CodeForces 14D Two Paths

来源:互联网 发布:我与网络演讲稿2000字 编辑:程序博客网 时间:2024/05/19 12:18
D. Two Paths
time limit per test
2 seconds
memory limit per test
64 megabytes
input
standard input
output
standard output

As you know, Bob's brother lives in Flatland. In Flatland there are n cities, connected by n - 1 two-way roads. The cities are numbered from 1 ton. You can get from one city to another moving along the roads.

The «Two Paths» company, where Bob's brother works, has won a tender to repair two paths in Flatland. A path is a sequence of different cities, connected sequentially by roads. The company is allowed to choose by itself the paths to repair. The only condition they have to meet is that the two paths shouldn't cross (i.e. shouldn't have common cities).

It is known that the profit, the «Two Paths» company will get, equals the product of the lengths of the two paths. Let's consider the length of each road equals 1, and the length of a path equals the amount of roads in it. Find the maximum possible profit for the company.

Input

The first line contains an integer n (2 ≤ n ≤ 200), wheren is the amount of cities in the country. The followingn - 1 lines contain the information about the roads. Each line contains a pair of numbers of the cities, connected by the roadai, bi (1 ≤ ai, bi ≤ n).

Output

Output the maximum possible profit.

Sample test(s)
Input
41 22 33 4
Output
1
Input
71 21 31 41 51 61 7
Output
0
Input
61 22 32 45 46 4
Output
4



这题研究了好久,最后看了看别人的题解才过了。可能还是自己对树这一块布太熟悉吧,要多学习学习。

题目大意:

把一个图沿一条边割开,分成两个树,求这两个数中最长的路的乘积。

这里需要分别求两个树的直径。

因为题目数据不大,直接枚举边即可。

DFS从当前点开始搜索,把枚举的那条边先当作删掉,DFS当前点存在的最大深度和次大深度,两个相加不断更新最值,便可得到一边树的直径。

最后相乘即可。


#include <stdio.h>#include <vector>#include <algorithm>using namespace std;const int MAXN=205;vector<int> graph[MAXN];int currentSum=0;int dfs(int startPoint,int endPoint){        if(graph[startPoint].size()==0)                return 0;        int sum=0,firstMax=0,secondMax=0;        for(unsigned int i=0;i<graph[startPoint].size();i++)        {                if(graph[startPoint][i]!=endPoint)                {                        int temp=dfs(graph[startPoint][i],startPoint);                        sum=max(temp,sum);                        if(currentSum>firstMax)                        {                                secondMax=firstMax;                                firstMax=currentSum;                        }                        else if(currentSum>secondMax)                                secondMax=currentSum;                }        }        currentSum=firstMax+1;        sum=max(sum,firstMax+secondMax);        return sum;}int main(){        int n,a,b,ans=0;        scanf("%d",&n);        for(int i=0;i<n-1;i++)        {                scanf("%d%d",&a,&b);                graph[a].push_back(b);                graph[b].push_back(a);        }        for(int i=1;i<=n;i++)                for(int j=0;j<graph[i].size();j++)                {                        int sumFromSourcei=dfs(i,graph[i][j]);                        int sumFromSourcej=dfs(graph[i][j],i);                        ans=max(ans,sumFromSourcei*sumFromSourcej);                }        printf("%d\n",ans);        return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 左侧脑室增宽该怎么办 腿上的血管堵塞怎么办 做b超看不清骶尾怎么办 孕中期羊水过少怎么办 心脏办膜关闭不全怎么办 9个月胎儿脑积水怎么办 怀孕三个月胎盘低置怎么办 怀孕第一个月打针了怎么办 唐氏筛查神经管缺陷高风险怎么办 门诊处方笺丢了怎么办 孕中期睡觉手麻怎么办 怀孕2个月了没胎心胎芽怎么办 怀孕腿疼的厉害怎么办 孕妇老是失眠多梦怎么办 孕妇会失眠多梦怎么办 怀孕5个月睡不着怎么办 6个月孕妇失眠怎么办 彩超脉络丛囊肿怎么办 双侧脉络丛囊肿怎么办 唐筛神经管缺陷高风险怎么办 雌激素低怎么办吃什么东西补 我怀了狗的孩子怎么办 结婚2年不要孩子怎么办 备孕一直没怀孕怎么办 刚生的婴儿打嗝怎么办 小孩40天黄疸高怎么办 婴儿身高长得慢怎么办 四个月的宝宝哭怎么办 孕39周羊水偏多怎么办 孕39周羊水浑浊怎么办 孕晚期羊水过少怎么办 怀孕脐带绕颈一周怎么办 nt检查宝宝趴着怎么办 四维胎儿有问题怎么办 怀孕70天没有胎心怎么办 怀孕20天不想要怎么办 换轮胎胎压监测怎么办 怀孕了吐的厉害该怎么办 怀孕吐完嗓子疼怎么办 怀孕16周不想要怎么办 怀孕四个月胎盘低置怎么办