(File IO): input:tree.in output:tree.out
时间限制: 1000 ms 空间限制: 131072 KB 具体限制
Goto ProblemSet
题目描述
味味最近对树很感兴趣,什么是树呢?树就是有
n
n
n个点和
n
−
1
n-1
n−1条边形成的无环连通无向图。
今年
2012
2012
2012年浙江省队选拔赛中味味发现了一个树中最长链(就是树当中距离最远的点对)试题,于是她着手对树进行了一些研究和思考。
味味在研究过程中想知道,对于一个无根树,当节点i作为根的时候树的高是多少。所谓树高指的是从根节点出发,到离根节点最远叶子节点所经过的节点的总数,详见输入输出样例
1
1
1。
味味现在遇到了一些烦心的事情,不想再继续思考了,请你帮助她解决这个问题。
输入
输入文件名为
t
r
e
e
.
i
n
tree.in
tree.in,共
N
N
N 行。第一行为一个正整数
N
N
N,表示树的节点个数。第
2
2
2 行到第 N行里,每行两个用空格隔开的正整数
a
a
a 和
b
b
b,表示
a
a
a 与
b
b
b有连边。
输出
输出文件
t
r
e
e
.
o
u
t
tree.out
tree.out 共
N
N
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
数据范围限制
对于
30
30
30%的数据有
N
≤
100
N≤ 100
N≤100。
对于
60
60
60%的数据有
N
≤
300
N≤ 300
N≤300。
对于
100
100
100%的数据有
1
≤
N
≤
1000
,
1
≤
a
,
b
≤
N
1≤N≤1000,1≤a,b≤N
1≤N≤1000,1≤a,b≤N
提示
解题思路
可以用
S
P
F
A
SPFA
SPFA来做这道题
代码
#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;
}
}