(File IO): input:tree.in output:tree.out
時間限制: 1000 ms 空間限制: 131072 KB 具體限制
Goto ProblemSet
題目描述
味味最近對樹很感興趣,什麼是樹呢?樹就是有個點和條邊形成的無環連通無向圖。
今年年浙江省隊選拔賽中味味發現了一個樹中最長鏈(就是樹當中距離最遠的點對)試題,於是她着手對樹進行了一些研究和思考。
味味在研究過程中想知道,對於一個無根樹,當節點i作爲根的時候樹的高是多少。所謂樹高指的是從根節點出發,到離根節點最遠葉子節點所經過的節點的總數,詳見輸入輸出樣例。
味味現在遇到了一些煩心的事情,不想再繼續思考了,請你幫助她解決這個問題。
輸入
輸入文件名爲 ,共 行。第一行爲一個正整數 ,表示樹的節點個數。第 行到第 N行裏,每行兩個用空格隔開的正整數 和,表示 與有連邊。
輸出
輸出文件 共 行,第i行表示以節點i爲根時的樹高。
樣例輸入
【樣例輸入1】
3
1 2
2 3
【樣例輸入2】
4
1 4
2 4
3 4
樣例輸出
【樣例輸出1】
3
2
3
【樣例輸出2】
3
3
3
2
數據範圍限制
對於%的數據有 。
對於%的數據有 。
對於%的數據有
提示
解題思路
可以用來做這道題
代碼
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
long long n,a1,b,l,head[1010],q[10100],v[10100],h,t,ans,dis[10010];
struct c{
int x,next;
}a[10010];
void add(int x,int y){
a[++l].x=y;
a[l].next=head[x];
head[x]=l;
}
void bfs(int s)
{
for(int i=1;i<=1010;i++)
dis[i]=2147483647;
memset(v, 0, sizeof(v));
dis[s]=1;
v[s]=1;
q[1]=s;
h=0,t=1;
while(h<t)
{
h++;
int xx=q[h];
v[xx]=0;
for(int i=head[xx];i;i=a[i].next)
if(dis[xx]+1<dis[a[i].x])
{
dis[a[i].x]=dis[xx]+1;
if(!v[a[i].x])
{
v[a[i].x]=1;
t++;
q[t]=a[i].x;
}
}
}
}
int main(){
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n-1;i++)
{
scanf("%d%d",&a1,&b);
add(a1,b);
add(b,a1);
}
for(int i=1;i<=n;i++)
{
bfs(i);
for(int j=1;j<=n;j++)
if(dis[j]>ans&&dis[j]!=2147483647)
ans=dis[j];
printf("%lld\n",ans);
ans=0;
}
}