Cod sursa(job #2651604)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 23 septembrie 2020 04:13:03
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin ("radiatie.in");
ofstream fout ("radiatie.out");

struct muchie
{
    int a, b, c;
}v[30001];

int tt[15001], rg[15001], ct[15001], sterg[15001], maxlat[15001];
bool f[15001];

int comparare (muchie x, muchie y)
{
    return x.c<y.c;
}

int find (int x)
{
    while(tt[x]!=x)
    {
        x=tt[x];
    }

    return x;
}

void unite (int x, int y , int c)
{
    if(rg[x]>rg[y])
    {
        tt[y]=x;
        ct[y]=c;
    }

    else
    {
        tt[x]=y;
        ct[x]=c;
    }

    if(rg[x]==rg[y]) rg[y]++;
}


int main()
{
    int n, m, k, i, y, a, b, co;
    fin>>n>>m>>k;

    for(i=1; i<=m; i++)
    {
        fin>>v[i].a>>v[i].b>>v[i].c;
    }
    sort(v+1, v+m+1, comparare);

    for(i=1; i<=n; i++)
    {
        tt[i]=i;
        rg[i]=1;
    }

    //Aplic algoritmul lui Kruskal
    co=0;
    i=1;
    while(co<n-1)
    {
        int raux1=find(v[i].a);
        int raux2=find(v[i].b);

        if(raux1!=raux2)
        {
            co++;
            unite(raux1, raux2, v[i].c);
        }

        i++;
    }
    //cout<<"\n";


    for(y=1; y<=k; y++)
    {
        fin>>a>>b;

        if(a==b) fout<<0<<"\n";
        else
        {
            maxlat[a]=0;
            maxlat[b]=0;
            int numar_sterg=0;
            while(tt[a]!=tt[b] && f[ tt[a] ]==0 && f[ tt[b] ]==0)
            {
                //daca parintii inca nu s-au intalnit
                sterg[++numar_sterg]=tt[a];
                sterg[++numar_sterg]=tt[b];

                f[ tt[a] ]=1;
                f[ tt[b] ]=1;

                maxlat[ tt[a] ] = max(maxlat[a], ct[a]) ;
                a=tt[a];

                maxlat[ tt[b] ] = max(maxlat[b], ct[b]) ;
                b=tt[b];

            }

            //maxlat[ tt[a] ] = max(maxlat[a], ct[a]) ;
            //maxlat[ tt[b] ] = max(maxlat[b], ct[b]) ;

            if(f[ tt[b] ]==1) fout<<max( maxlat[ tt[b] ], ct[b] ) <<"\n";
            else if( f[ tt[a] ]==1) fout<<max( maxlat[ tt[a] ], ct[a])<<"\n";
            else fout<<max(max(max(maxlat[a], ct[a]), maxlat[b] ), ct[b] )<<"\n";

            for(i=1; i<=numar_sterg; i++)
            {
                f[ sterg[i] ]=0;
            }
        }

    }
}