Cod sursa(job #1323443)

Utilizator gabrielvGabriel Vanca gabrielv Data 21 ianuarie 2015 00:21:30
Problema Diametrul unui arbore Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

#define NMAX 100005

int N;
int Sol;

int dist[NMAX];

vector < int > G[NMAX];
vector < int > :: iterator it;

queue < int > Q;

void Read()
{
    freopen("darb.in","r",stdin);
    scanf("%d",&N);

    for(int i=1;i<N;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        G[x].push_back(y);
        G[y].push_back(x);
    }
}

void InitDist()
{
    dist[0] = 0;
    for(int i=1;i<=N;i++)
        dist[i] = -1;
}

void BFS(int S)
{
    Q.push(S);
    dist[S] = 0;

    while(!Q.empty())
    {
        int nod = Q.front();
        Q.pop();

        for(it = G[nod].begin(); it != G[nod].end(); it++)
        {
            if(dist[*it] != -1)
                continue;
            dist[*it] = dist[nod] + 1;
            Q.push(*it);
        }
    }
}

int SearchFurthestEdge()
{
    for(int i=1;i<=N;i++)
        if(dist[i] > dist[dist[0]])
            dist[0] = i;
    return dist[0];
}

void Solve()
{
    //Find first edge
    InitDist();
    BFS(1);
    int edge1 = SearchFurthestEdge();

    //Find second edge
    InitDist();
    BFS(edge1);
    int edge2 = SearchFurthestEdge();

    //Solution
    Sol = dist[edge2];
}

void Print()
{
    freopen("darb.out","w",stdout);

    for(int i=1;i<=N;i++)
        printf("%d ",dist[i]);
}

int main()
{
    Read();
    Solve();
    Print();
    return 0;
}