Cod sursa(job #2394377)

Utilizator RazvanPanaiteRazvan Panaite RazvanPanaite Data 1 aprilie 2019 16:34:29
Problema Radiatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <bits/stdc++.h>
#define DMAX 15010
#define LMAX 20

using namespace std;

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

struct nume{
    int x,c;
};
struct nume2{
    int y,x,c;
};

vector < vector<nume> > V;
vector < vector<nume> > arb;
vector < vector<nume> > trans;
priority_queue <nume2> heap;

bool uz[DMAX];

int M[DMAX][LMAX];
int h[DMAX];

int n,m,k,cate,hmax;

inline bool operator<(nume2 x,nume2 y){
    return x.c>y.c;
}
inline int maxim(int x,int y){
    if(x>y)
       return x;
    return y;
}

void citire();
void prim();
void dfs(int node);
int lca(int x,int y);

int main(){
    int i,x,y,node,a,b,aux,kk;
    citire();
    prim();

    memset(uz,0,sizeof(uz));
    dfs(1);

    while(k--)
        {fin>>a>>b;
         fout<<lca(a,b)<<'\n';
        }

    return 0;
}
void citire(){
    int i,x,y,cost;
    fin>>n>>m>>k;
    V.resize(n+5);
    arb.resize(n+5);
    trans.resize(n+5);
    for(i=1;i<=m;i++)
        {fin>>x>>y>>cost;
         V[x].push_back({y,cost});
         V[y].push_back({x,cost});
        }
}
void prim(){
    int i,j;
    nume2 var;
    uz[1]=true;
    for(i=0;i<V[1].size();i++)
        heap.push({1,V[1][i].x,V[1][i].c});
    for(i=2;i<=n;i++)
        {while(uz[heap.top().x])
               heap.pop();
         var=heap.top();
         uz[var.x]=true;

         arb[var.y].push_back({var.x,var.c});
         trans[var.x].push_back({var.y,var.c});

         for(j=0;j<V[var.x].size();j++)
             if(!uz[V[var.x][j].x])
                heap.push({var.x,V[var.x][j].x,V[var.x][j].c});
        }
}
void dfs(int node){
    int i;
    uz[node]=true;
    for(i=0;i<arb[node].size();i++)
        if(!uz[arb[node][i].x])
           {h[arb[node][i].x]=h[node]+1;
            hmax=maxim(hmax,h[arb[node][i].x]);
            dfs(arb[node][i].x);
           }
}
int lca(int x,int y){
    int i,j,dist=0;
    if(h[x]>h[y])
       {int aux;
        aux=x;
        x=y;
        y=aux;
       }
    while(h[x]<h[y])
          {dist=maxim(dist,trans[y][0].c);
           y=trans[y][0].x;
          }
    while(x!=y)
          {dist=maxim(dist,trans[x][0].c);
           x=trans[x][0].x;
           dist=maxim(dist,trans[y][0].c);
           y=trans[y][0].x;
          }
    return dist;
}