FZU 1227 [닭털 편지 문제]

2359 단어
Description
대혁명 시기 에 지하 당 조직의 연락 도 는 나무 모양 의 구 조 였 다.모든 당원 은 그 보다 한 등급 높 은 책임자 와 만 단선 으로 연락 하지만 그 는 그 보다 한 등급 낮은 몇 명의 직접 부하 당원 과 연락 할 수 있다.긴급 상황 은 보통 닭털 편지 로 전달 된다.닭털 편 지 를 복사 하기 쉽다 고 가정 하지만 닭털 편 지 를 한 번 전달 하 는 데 는 1 단위 의 시간 이 필요 하 다.하나의 알고리즘 을 시험 적 으로 설계 하여 총 책임자 부터 닭털 편 지 를 모든 당원 에 게 전달 하 는 데 최소 얼마나 걸 리 는 지 계산한다.
주어진 지하 당 조직의 연락 도 에 대해 서 는 총 책임자 부터 닭털 편 지 를 모든 당원 에 게 전달 하 는 데 필요 한 최소 시간 을 계산한다.
Input
첫 번 째 줄 은 당원 총수 n (1 < n < 500001) 이다.전체 당원 번 호 는 0, 1,..., n - 1 이다.번호 가 0 인 당원 은 총 책임자 다.두 번 째 줄 부터 모두 n - 1 줄 이 있 고 줄 마다 2 개의 정수 u 와 v 가 있 으 며 당원 u 와 당원 v 간 의 단선 관 계 를 나타 낸다.
파일 끝까지 처리 하 다.
Output
모든 당원 에 게 닭털 편 지 를 전달 하 는 데 필요 한 최소한 의 시간.
Sample Input
4
0 2
0 3
1 2
Sample Output
2
트 리 동적 계획.
공부 중 입 니 다.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
const int MAX=50010;
using namespace std;
typedef struct nn
{
    int v;
    struct nn*next;
} node;
node set[2*MAX],*top,*adj[MAX];
int n,res[MAX],tmp[MAX];
inline node*create(int k,node*p)
{
    top->v=k;
    top->next=p;
    return top++;
}
bool input()
{
    int i,a,b;
    if(EOF==scanf("%d",&n))
    {
        return false;
    }
    memset(adj,0,n*sizeof(adj[0]));
    for(i=0,top=set; i<n-1; i++)
    {
        scanf("%d%d",&a,&b);
        adj[a]=create(b,adj[a]);
        adj[b]=create(a,adj[b]);
    }
    return true;
}
void edge(int v,int father)
{
    node*p,*pre;
    if(adj[v]->v==father)
    {
        adj[v]=adj[v]->next;
    }
    else
    {
        for(pre=adj[v],p=adj[v]->next; p; p=p->next,pre=pre->next)
        {
            if(p->v==father)
            {
                pre->next=p->next;
                break;
            }
        }

    }
    for(p=adj[v]; p; p=p->next)
    {
        edge(p->v,v);
    }
}

void solve(int v)
{
    node*p;
    int b,i,j;
    for(p=adj[v];p;p=p->next)
    {
        solve(p->v);
    }
    for(p=adj[v],b=0;p;p=p->next)
    {
        tmp[b++]=res[p->v];
    }
    sort(tmp,tmp+b);
    for(res[v]=0,i=b-1;i>=0;--i)
    {
        res[v]=max(res[v],tmp[i]+b-i);
    }
}
int main()
{
while(input())
{
    edge(0,-1);
    solve(0);
    printf("%d
",res[0]); } return 0; }

좋은 웹페이지 즐겨찾기