Cod sursa(job #928685)

Utilizator lily3Moldovan Liliana lily3 Data 26 martie 2013 17:04:38
Problema Radiatie Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;

int i,j,n,m,niv[15001],tata[15001],k,m1,m2,d[15001],b[15001];
unsigned long max1,c[15001],cost1;
bool viz[15001];
struct muchii
{
    int x,y;
    unsigned long cost;
};
muchii a[30001];
struct arbore
{
    int nod;
    unsigned long cc;
};
vector<arbore> v[15001];

void df(int x)
{
    int i;
    viz[x]=1;
    for(i=0;i<v[x].size();++i)
    if(!viz[v[x][i].nod])
    {
        tata[v[x][i].nod]=x;
        niv[v[x][i].nod]=niv[x]+1;
        c[v[x][i].nod]=v[x][i].cc;
        df(v[x][i].nod);
    }
}
bool cmp(muchii a,muchii b)
{
    return a.cost<b.cost;
}
int componenta(int x)
{
    int r=x,aux;
    while(r!=d[r])
    r=d[r];
    while(x!=d[x])
    {
        aux=d[x];
        d[x]=r;
        x=aux;
    }
    return r;
}
int main()
{
    ifstream f("radiatie.in");
    ofstream g("radiatie.out");
    f>>n>>m>>k;
    for(i=1;i<=m;++i)
    f>>a[i].x>>a[i].y>>a[i].cost;

    sort(a+1,a+m+1,cmp);
    for(i=1;i<=n;++i)
    d[i]=i;

    int nr=0;
    for(i=1;i<=m&&nr<n;++i)
    {
        m1=componenta(a[i].x);
        m2=componenta(a[i].y);
        if(m1!=m2)
        {
            b[++nr]=i;
            d[m2]=m1;
        }
    }
    for(i=1;i<n;++i)
    {
        m1=a[b[i]].x;
        m2=a[b[i]].y;
        cost1=a[b[i]].cost;
        v[m1].push_back((arbore) {m2,cost1});
        v[m2].push_back((arbore) {m1,cost1});

    }

    df(1);

    for(i=1;i<=k;++i)
    {
        f>>m1>>m2;
        max1=0;
        while(niv[m1]>niv[m2])
        {
            max1=max(c[m1],max1);
            m1=tata[m1];
        }

        while(niv[m2]>niv[m1])
        {
            max1=max(c[m2],max1);
            m2=tata[m2];
        }

        while(m1!=m2)
        {
            max1=max(max1,max(c[m1],c[m2]));
            m1=tata[m1];
            m2=tata[m2];
        }

        g<<max1<<"\n";
    }
    return 0;
}