(Jizhong) 2173. UNROOTED 나무 (트리)] SPFA

(파일 IO) : 입력 : tree.in 출력 : tree.out의
시간 제한 : 1000 MS 공간 제약 : 13만1천72킬로바이트의 특정 제한
고토 ProblemSet


제목 설명
맛 맛이 최근 매우 나무에 관심이, 무슨 나무입니까? 나무가있다 포인트 - 1 N-1 제 비 고리 통신 가장자리는 무향 그래프를 형성한다.
금년에 2,012 2,012 절강 성 팀 재판 맛의 풍미는 그녀가 나무 몇 가지 조사 및 사고에 착수, 그래서 질문 (트리 먼 지점입니다) 가장 긴 체인 트리에서 발견.
높은 트리의 루트 노드의 난 때 때 연구 기간 동안 풍미 맛은 뿌리가 나무에 대해 알고 싶어. 소위 트리 높이 즉, 루트 노드로부터 리프 노드 먼의 루트 노드에서 시작되는 입출력 참조 샘플의 총 개수 1 1 .
맛의 맛은 지금 몇 가지, 귀찮게 생각을 계속, 그녀는이 문제를 해결하는 데 도움을 요청하지 않으려했다.


입력
라는 파일에 아르 자형 e e . i n tree.in N 라인. 첫 번째 라인은 양의 정수 N 트리의 노드의 수를 나타냅니다. 첫 번째 2 N 행을 행하기 위해, 각 행은 두 개의 공간으로 분리 양수 a b 나타내고 a b 연결된 쪽.

출력
출력 파일 t r e e . o u t tree.out 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