(纪中)2173. 无根树(tree)【SPFA】

(File IO): input:tree.in output:tree.out
时间限制: 1000 ms 空间限制: 131072 KB 具体限制
Goto ProblemSet


题目描述
味味最近对树很感兴趣,什么是树呢?树就是有 n n 个点和 n 1 n-1 条边形成的无环连通无向图。
今年 2012 2012 年浙江省队选拔赛中味味发现了一个树中最长链(就是树当中距离最远的点对)试题,于是她着手对树进行了一些研究和思考。
味味在研究过程中想知道,对于一个无根树,当节点i作为根的时候树的高是多少。所谓树高指的是从根节点出发,到离根节点最远叶子节点所经过的节点的总数,详见输入输出样例 1 1
味味现在遇到了一些烦心的事情,不想再继续思考了,请你帮助她解决这个问题。


输入
输入文件名为 t r e e . i n tree.in ,共 N N 行。第一行为一个正整数 N N ,表示树的节点个数。第 2 2 行到第 N行里,每行两个用空格隔开的正整数 a a b b ,表示 a a b b 有连边。

输出
输出文件 t r e e . o u t tree.out 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 %的数据有 N 100 N≤ 100
对于 60 60 %的数据有 N 300 N≤ 300
对于 100 100 %的数据有 1 N 1000 1 a b N 1≤N≤1000,1≤a,b≤N


提示


解题思路
可以用 S P F A 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;
   }
}
发布了119 篇原创文章 · 获赞 8 · 访问量 4934

猜你喜欢

转载自blog.csdn.net/kejin2019/article/details/104602606