Cod sursa(job #1424868)

Utilizator cosmin.alexCosmin Alexandru cosmin.alex Data 25 aprilie 2015 16:54:56
Problema Diametrul unui arbore Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
  ifstream f("darb.in");
ofstream g("darb.out");
int n,m,c[100000],viz[1000000],d[1000000],p,u,tata[1000000],et[1000000];
vector <int> a[1000000];
void bf(int x,int &y)
{
    int i,j;
    while(p<=u)
        {i=c[p];
        //cout<<"c["<<p<<"]="<<c[p]<<endl;
      //  cout<<i<<" "<<endl;
        for(j=0;j<a[i].size();j++)
                if(viz[a[i][j]]==0)
                    {u++;
                    c[u]=a[i][j];
                    //cout<<"c["<<u<<"]="<<c[u]<<endl;
                    viz[a[i][j]]=1;
                    tata[a[i][j]]=i;
                    d[a[i][j]]=d[tata[a[i][j]]]+1;}
        p++;}
    y=c[u];
}
void bf_niv(int x,int &y)
{
    int i,j,niv=1,max=0;
    for(i=1;i<=n;i++)
        viz[i]=0;
    viz[x]=1;
    et[x]=0;
    while(p<=u)
        {i=c[p];
        //cout<<i<<" ";
        for(j=0;j<a[i].size();j++)
                if(viz[a[i][j]]==0)
                    {u++;
                    c[u]=a[i][j];
                    viz[a[i][j]]=1;
                    et[a[i][j]]=niv;
                    }
        if(et[c[p]]!=et[c[p+1]])
            niv++;
        p++;}
    y=c[u];
    for(i=1;i<=n;i++)
        {if(max<et[i])
            max=et[i];
           // cout<<"et["<<i<<"]="<<et[i]<<endl;
           }
   g<<max;
  /* cout<<endl<<"Centrul: ";
   if(max%2==1)
        {p=max/2;
       u=max/2+1;
       for(i=1;i<=n;i++)
            {if(et[i]==p)
               cout<<i<<" ";
            if(et[i]==u)
               cout<<i<<" ";}
        }
   else
        {p=max/2+1;
       for(i=1;i<=n;i++)
            if(et[i]==p)
               cout<<i<<" ";
       } */
}

int main()
{
    int x,y,i,j;
    int t,t1,t2;

    f>>n>>m;

    for( i=1; i<=m; i++)
        {f>>x>>y;
         a[x].push_back(y);
         a[y].push_back(x);
        }

    for(i=1;i<=n;i++)
        if(a[i].size() == 1){ t=i; i=n+1;}

    p=u=t;
    viz[t]=1;
    c[p]=t;
    d[t]=0;
    bf(t,t1);
    p=u=t1;
    c[p]=t1;
    d[t1]=0;
    cout<<endl;
    bf_niv(t1,t2);
    return 0;
}