zoukankan      html  css  js  c++  java
  • HihoCoder第十一周:树中的最长路

    #1050 : 树中的最长路

    时间限制:10000ms

    单点时限:1000ms

    内存限制:256MB

    描述

    上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一棵二叉树!还可以拼凑成一棵多叉树——好吧,其实就是更为平常的树而已。

    但是不管怎么说,小Ho喜爱的玩具又升级换代了,于是他更加爱不释手(其实说起来小球和木棍有什么好玩的是吧= =)。小Ho手中的这棵玩具树现在由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不同的数字,并且这些数字都是出于1..N的范围之内,每根木棍都连接着两个不同的小球,并且保证任意两个小球间都不存在两条不同的路径可以互相到达。总而言之,是一个相当好玩的玩具啦!

    但是小Hi瞧见小Ho这个样子,觉得他这样沉迷其中并不是一件好事,于是寻思着再找点问题让他来思考思考——不过以小Hi的水准,自然是手到擒来啦!

    于是这天食过早饭后,小Hi便对着又拿着树玩具玩的不亦乐乎的小Ho道:你说你天天玩这个东西,我就问你一个问题,看看你可否知道?

    不好!Ho想都不想的拒绝了。

    那你就继续玩吧,一会回国的时候我不叫上你了~”Hi严肃道。

    诶!别别别,你说你说,我听着呢。一向习惯于开启跟随模式的小Ho忍不住了,马上喊道。

    Hi满意的点了点头,随即说道:这才对嘛,我的问题很简单,就是——你这棵树中哪两个结点之间的距离最长?当然,这里的距离是指从一个结点走到另一个结点经过的木棍数。

    啊?Ho低头看了看手里的玩具树,困惑了。

    输入

    每个测试点(输入文件)有且仅有一组测试数据。

    每组测试数据的第一行为一个整数N,意义如前文所述。

    每组测试数据的第2~N行,每行分别描述一根木棍,其中第i+1行为两个整数AiBi,表示第i根木棍连接的两个小球的编号。

    对于20%的数据,满足N<=10

    对于50%的数据,满足N<=10^3

    对于100%的数据,满足N<=10^51<=Ai<=N, 1<=Bi<=N

    HiTip:那些用数组存储树边的记得要开两倍大小哦!

    输出

    对于每组测试数据,输出一个整数Ans,表示给出的这棵树中距离最远的两个结点之间相隔的距离。

    样例输入

    8

    1 2

    1 3

    1 4

    4 5

    3 6

    6 7

    7 8

    样例输出

    6


    必须说明,这题是看了别人的代码才AC的,看hint完全不知道怎么做。也通过这题,初步认识了DFS,觉得没有想象中的那么难,很好理解。

    代码:

    #include <iostream>
    #include <vector>
    #include <string>
    #include <cstring>
    using namespace std;
    
    vector <int> node[100005];
    int result=0;
    int used[100005];
    
    int dfs(int i)
    {
    	used[i]=1;
    	int k;
    	int ret=0;
    	int m1=0,m2=0;
    	for(k=0;k<node[i].size();k++)
    	{
    		if(!used[node[i][k]])
    		{
    			int temp=dfs(node[i][k]);
    			if(temp>m1)
    			{
    				m2=m1;
    				m1=temp;
    			}
    			else if(temp>m2)
    			{
    				m2=temp;
    			}
    			ret=max(ret,temp);
    		}
    	}
    	used[i]=0;
    	if(m1+m2+1>result)
    		result=m1+m2;
    	return ret+1;
    }
    int main()
    {
    	int count,k;
    	cin>>count;
    	memset(used,0,sizeof(used));
    	while(count>1)
    	{
    		int node1,node2;
    		cin>>node1>>node2;
    
    		node[node1].push_back(node2);
    		node[node2].push_back(node1);
    		count--;
    	}
    
    	dfs(1);
    	cout<<result<<endl;
    	return 0;
    }
    


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    当Django模型迁移时,报No migrations to apply 问题时
    django--各个文件的含义
    django--创建项目
    1013. Battle Over Cities (25)
    1011. World Cup Betting (20)
    1009. Product of Polynomials (25)
    1007. Maximum Subsequence Sum (25)
    1006. Sign In and Sign Out (25)
    1008. Elevator (20)
    1004. Counting Leaves (30)
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4785897.html
Copyright © 2011-2022 走看看