Cod sursa(job #2045020)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 21 octombrie 2017 18:16:31
Problema Diametrul unui arbore Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

#define ll long long
#define ull unsigned long long
#define pb push_back
const int NMax = 1e5 + 5;
const ll inf = 1e18 + 7;

int N,mxDist,mxNode;
vector<int> v[NMax];
// mxDist - distanta maxima dintre oricare doua noduri;
// mxNode - nodul cel mai indepartat de sursa curenta
// (astfel incat distanta dintre cele doua este mxDist);
// v[i] - lista de adiacenta pentru nodul i;

void dfs(int,int,int);
// dfs - functie care realizeaza recursiv o parcurgere in adancime,
// aceasta se poate folosi pentru aflarea distantelor deoarece graful dat este un arbore;

int main() {
    FILE *in = fopen("darb.in","r"),
         *out = fopen("darb.out","w");

    fscanf(in,"%d",&N);
    for (int i=1;i < N;++i) {
        int x,y;
        fscanf(in,"%d%d",&x,&y);

        v[x].pb(y);
        v[y].pb(x);
    }

    // se gaseste nodul cel mai indeparat de radacina;
    mxDist = -1;
    dfs(1,0,1);

    // se gaseste nodul cel mai indepartat de cel gasit anterior;
    mxDist = -1;
    dfs(mxNode,0,1);

    fprintf(out,"%d\n",mxDist);

    return 0;
}

void dfs(int node,int dad,int dist) {
    if (mxDist < dist) {
        mxDist = dist;
        mxNode = node;
    }

    for (int nxt : v[node]) {
        if (nxt == dad) {
            continue;
        }

        dfs(nxt,node,dist+1);
    }
}