Cod sursa(job #1693953)

Utilizator Bodo171Bogdan Pop Bodo171 Data 24 aprilie 2016 13:15:24
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <iostream>
#include<fstream>
#include<algorithm>
using namespace std;
int tt[15005],rg[15005],noq,q,n,x,y,cost[15005],newcost[15005],m,i,ok,lmin,mark[15005];
struct muchie
{
    int a,b,c;
}v[30005];
bool compare(muchie x,muchie y)
{
    return x.c<y.c;
}
int cauta(int x)
{
    while(x!=tt[x])
        x=tt[x];//aplic padurile
    //dar fara compresia drumurilor,ca arborele rezultat sa
    //fie chiar apm-ul
    return x;
}
void uneste(int x,int y,int par)//par reprezinta costul drumului catre tatal nodului
{
   if(rg[x]>rg[y]) {tt[y]=x;cost[y]=par;}
   else {tt[x]=y;cost[x]=par;}
   if(rg[x]==rg[y]) rg[y]++;//reunesc dupa rang
   return;
}
inline void kruskal()
{
    //gasesc apm-ul,ca sa am cele mai mici muchii care nu formeaza un ciclu
    sort(v+1,v+m+1,compare);
    for(i=1;i<=m;i++)
    {
        if(cauta(v[i].a)!=cauta(v[i].b))
            uneste(cauta(v[i].a),cauta(v[i].b),v[i].c);
    }
}
int query(int x,int y)
{
    //mark reprezinta ultimul query la care nodul a fost marcat,
    //lca-ul se gaseste in momentul in care dau de un nod pentru care mark==q
    newcost[x]=0;
    newcost[y]=0;
    mark[x]=q;
    mark[y]=q;

    ok=0;
    while(!ok)
    {
        if(mark[tt[x]]==q&&x!=tt[x])
        {

            newcost[tt[x]]=max(newcost[tt[x]],cost[x]);
            ok=newcost[tt[x]];
        }
        mark[tt[x]]=q;
        newcost[tt[x]]=max(cost[x],newcost[x]);
        x=tt[x];


        if(mark[tt[y]]==q&&y!=tt[y])
        {

            newcost[tt[y]]=max(newcost[tt[y]],cost[y]);
            ok=newcost[tt[y]];
        }
        mark[tt[y]]=q;
        newcost[tt[y]]=max(cost[y],newcost[y]);
        y=tt[y];

    }

    return ok;
}
int main()
{
    ifstream f("radiatie.in");
    ofstream g("radiatie.out");
    f>>n>>m>>noq;
    for(i=1;i<=m;i++)
    {
        f>>v[i].a>>v[i].b>>v[i].c;


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

    for(q=1;q<=noq;q++)
    {
        f>>x>>y;
        lmin=query(x,y);
        g<<lmin<<'\n';
    }
    return 0;
}