Cod sursa(job #2394183)

Utilizator serbandonceanSerban Doncean serbandoncean Data 1 aprilie 2019 13:11:43
Problema Radiatie Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.36 kb
#include <fstream>
#include <vector>
#include <cmath>
#include <algorithm>
#define NMAX 15100
#define MMAX 30100
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int n,nr,m,cx,cy;
int k;
inline int maxim(int a,int b)
    {
        if(a>b)
            return a;
        return b;
    }
    inline void swape(int& a,int& b)
    {
     int aux=a;
     a=b;
     b=aux;
    }
int h[MMAX];
int tata[MMAX];
struct ele{int y,cost;};
vector<ele> g[NMAX];
int p[NMAX][30];
int coin[NMAX][30];
int level[NMAX];
void dfs(int start,int nivel);
ele tati[NMAX];

bool da[NMAX];
int Find(int x);
void Union (int x,int y);
int caut(int x,int y);

struct muchie{
            int x,y,cost;
            friend bool operator < (muchie a,muchie b);
            friend bool operator <= (muchie a,muchie b);
            friend bool operator >= (muchie a,muchie b);
            friend bool operator > (muchie a,muchie b);

                };
muchie H[MMAX],a[NMAX];
bool operator < (muchie a,muchie b)
{
    return a.cost<b.cost;
}
bool operator <= (muchie a,muchie b)
{
    return a.cost<=b.cost;
}
bool operator >= (muchie a,muchie b)
{
    return a.cost>=b.cost;
}
bool operator > (muchie a,muchie b)
{
    return a.cost>b.cost;
}
int nrsel,costtotal;muchie mmin;
void creare();

void combinare(int n,muchie H[],int poz);   ///poz=pozitia radacinii
muchie  extragemin(int &n , muchie H[]);
void heapsort();
int main()
{//citire(n,H);
    int i,j;
    int x,y,m1,m2,lca,lo;
    creare();
    int nrm=1;
    while(nrsel<n-1)
    {
        mmin=H[nrm];
        cx=Find(mmin.x);
        cy=Find(mmin.y);
        if(cx!=cy)
        {
            nrsel++;
            costtotal+=mmin.cost;
            a[nrsel]=mmin;
            Union(cx,cy);
        }
        nrm++;

    }

    for(i=1;i<=n-1;i++)
        g[a[i].x].push_back({a[i].y,a[i].cost}),g[a[i].y].push_back({a[i].x,a[i].cost});
    dfs(1,1);
    /*for(j=0;j<=log2(n);j++)
        for(i=1;i<=n;i++)
            if(!j)
                p[i][j]=tati[i].y,coin[i][j]=tati[i].cost;
                else
                p[i][j]=p[p[i][j-1]][j-1],coin[i][j]=maxim(coin[i][j-1],coin[p[i][j-1]][j-1]);*/


    for(i=1;i<=k;i++)
    {
        fin>>x>>y;
        fout<<caut(x,y)<<'\n';
    }




}

void creare()
{int i;
  fin>>n>>m>>k;
  for(i=1;i<=m;i++)  fin>>H[i].x>>H[i].y>>H[i].cost;
  sort(H+1,H+m+1);
}

int Find(int x)
{
    int rad=x;int aux;
    while(tata[rad])
        rad=tata[rad];

    return rad;
}
void Union(int x,int y)
{   if(h[x]<h[y])
    tata[x]=y;
    else
    {tata[y]=x;if(h[x]==h[y])h[x]++;}
}

void dfs(int start,int nivel)
{
    int i;
    da[start]=1;
    level[start]=nivel;
    for(i=0;i<g[start].size();i++)
        if(!da[g[start][i].y])
            tati[g[start][i].y].y=start,tati[g[start][i].y].cost=g[start][i].cost,dfs(g[start][i].y,nivel+1);
}
int caut(int x,int y)
{ int sol=0,nv1,nv2;
    nv1=level[x];
    nv2=level[y];
    while(nv1>nv2)
    {
        sol=maxim(sol,tati[x].cost);
        x=tati[x].y;nv1--;
    }

    while(nv2>nv1)
    {
        sol=maxim(sol,tati[y].cost);
        y=tati[y].y;nv2--;
    }
    while(x!=y)
    {
        sol=maxim(sol,tati[x].cost);
        sol=maxim(sol,tati[y].cost);
        x=tati[x].y;
        y=tati[y].y;
    }
    return sol;
}