Cod sursa(job #2470537)

Utilizator stefantagaTaga Stefan stefantaga Data 9 octombrie 2019 14:14:09
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.94 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
vector <int> a[15005];
struct wow
{
    int a,b,cost;
}v[30005];
int tata[15005],rang[15005];
int repr(int x)
{
    if (tata[x]!=x)
    {
        tata[x]=repr(tata[x]);
    }
    return tata[x];
}
void uneste (int x,int y)
{
    x=repr(x);
    y=repr(y);
    if(x==y)
       {
         return ;
       }
    if (rang[x]<rang[y])
    {
        tata[x]=y;
    }
    else
    if (rang[y]<rang[x])
    {
        tata[y]=x;
    }
    else
    {
        tata[x]=y;
        rang[y]++;
    }
}
bool compare (wow a,wow b)
{
    return a.cost<b.cost;
}
int rmq[16][30005],viz[30005],v1[30005],poz[15005],poz2[15005];
void dfs(int x,int niv)
{
    int j;
    v1[++q]=x;
    v4[q]=niv;
    if (poz[x]==0)
    {
        poz[x]=q;
    }
    viz[x]=1;
    for (j=0;j<a[x].size();j++)
    {
        if (viz[a[x][j]]==0)
        {
            dfs(a[x][j],niv);
            v1[++q]=x;
            v4[q]=niv;
        }
    }
}
int df2(int x)
{
    int j;
    v3[++q1]=valoare[x];
    poz2[x]=q1;
    viz[x]=1;
    for (j=0;j<a[x].size();j++)
    {
        if (viz[a[x][j]]==0)
        {
            dfs2(a[x][j]);
        }
    }
    v3[++q1]=-valoare[x];
}
int main()
{
    f>>n>>m>>k;
    for (i=1;i<=m;i++)
    {
        f>>v[i].x>>v[i].y>>v[i].z;
        if (v[i].x>v[i].y)
        {
            swap(v[i].x,v[i].y);
        }
    }
    sort (v+1,v+m+1,compare);
    for (i=1;i<=n;i++)
    {
        tata[i]=i;
        rang[i]=0;
    }
    for (i=1;i<=m;i++)
    {
        if (repr(v[i].x)!=repr(v[i].y))
        {
            uneste(v[i].x,v[i].y);
            a[v[i].x].push_back(v[i].y);
            a[v[i].y].push_back(v[i].x);
            valoare[v[i].y]=v[i].cost;
        }
    }
    q=0;
    dfs(1,1);
    nr=log2(q);
    for (i=1;i<=q;i++)
    {
        rmq[0][i]=i;
    }
    putere[0]=1;
    for (i=1;i<=nr;i++)
    {
        putere[i]=putere[i-1]*2;
    }
    for (i=1;i<=nr;i++)
    {
        for (j=1;j<=q-putere[i]+1;j++)
        {
            if (a[rmq[i-1][j]]<a[rmq[i-1][j+putere[i-1]]])
            {
                rmq[i][j]=rmq[i-1][j];
            }
            else
            {
                rmq[i][j]=rmq[i-1][j+putere[i-1]];
            }
        }
    }
    for (i=1;i<=n;i++)
    {
        viz[i]=0;
    }
    dfs2(1);
    for (i=1;i<=q1;i++)
    {
        v3[i]+=v3[i-1];
    }
    for (i=1;i<=k;i++)
    {
        f>>x>>y;
        st=min(poz[x],poz[y]);
        dr=max(poz[x],poz[y]);
        if (x==y)
        {
            lca=v1[dr];
        }
        else
        {
            int k1=log2(dr-st);
        if (a[rmq[k1][st]]<a[rmq[k1][dr-(1<<k1)+1]])
        {
            lca=nani[rmq[k1][st]];
        }
        else
        {
            lca=nani[rmq[k1][dr-(1<<k1)+1]];
        }
        }

    }
    return 0;
}