(紀中)2173. 無根樹(tree)【SPFA】

(File IO): input:tree.in output:tree.out
時間限制: 1000 ms 空間限制: 131072 KB 具體限制
Goto ProblemSet


題目描述
味味最近對樹很感興趣,什麼是樹呢?樹就是有nn個點和n1n-1條邊形成的無環連通無向圖。
今年20122012年浙江省隊選拔賽中味味發現了一個樹中最長鏈(就是樹當中距離最遠的點對)試題,於是她着手對樹進行了一些研究和思考。
味味在研究過程中想知道,對於一個無根樹,當節點i作爲根的時候樹的高是多少。所謂樹高指的是從根節點出發,到離根節點最遠葉子節點所經過的節點的總數,詳見輸入輸出樣例11
味味現在遇到了一些煩心的事情,不想再繼續思考了,請你幫助她解決這個問題。


輸入
輸入文件名爲 tree.intree.in,共 NN 行。第一行爲一個正整數 NN,表示樹的節點個數。第22 行到第 N行裏,每行兩個用空格隔開的正整數aabb,表示aabb有連邊。

輸出
輸出文件tree.outtree.outNN 行,第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


數據範圍限制
對於3030%的數據有 N100N≤ 100
對於6060%的數據有 N300N≤ 300
對於100100%的數據有 1N10001abN1≤N≤1000,1≤a,b≤N


提示


解題思路
可以用SPFASPFA來做這道題


代碼

#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;
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章