樹的最長路

描述

上回說到,小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行爲兩個整數Ai,Bi,表示第i根木棍連接的兩個小球的編號。

對於20%的數據,滿足N<=10。

對於50%的數據,滿足N<=10^3。

對於100%的數據,滿足N<=10^5,1<=Ai<=N, 1<=Bi<=N

小Hi的Tip:那些用數組存儲樹邊的記得要開兩倍大小哦!

輸出

對於每組測試數據,輸出一個整數Ans,表示給出的這棵樹中距離最遠的兩個結點之間相隔的距離。

樣例輸入
8
1 2
1 3
1 4
4 5
3 6
6 7
7 8
樣例輸出
6
//Serene
//紫書p281 樹的最長路徑 
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=100000+10,INF=1<<30;
int T,n;

int aa;char c;
int read() {
	aa=0;c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9') aa=aa*10+c-'0',c=getchar();
	return aa;
}

int to[2*maxn],nxt[2*maxn],fir[maxn],e=0;
void add(int u,int v) {
	to[++e]=v;nxt[e]=fir[u];fir[u]=e;
	to[++e]=u;nxt[e]=fir[v];fir[v]=e;
}

bool vis[maxn];
int ans[maxn],maxlen[maxn];
void dfs(int pos) {
	vis[pos]=1;ans[pos]=pos;maxlen[pos]=1;
	int x,y;
	for(x=fir[pos];x;x=nxt[x]) {
		y=to[x];
		if(!vis[y]) {
			dfs(y);
			if(maxlen[y]+1>maxlen[pos]) {
				maxlen[pos]=maxlen[y]+1;
				ans[pos]=ans[y];
				
			}
		}
	}
}

int main() {
	int x,y;
	n=read();
	for(int i=1;i<n;++i) {
		x=read();y=read();
		add(x,y);
	}
	dfs(1);
	memset(vis,0,sizeof(vis));
	x=ans[1]; dfs(x);
	printf("%d",maxlen[x]-1);
	return 0;
} 

發佈了36 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章