Cod sursa(job #1517543)

Utilizator GinguIonutGinguIonut GinguIonut Data 4 noiembrie 2015 16:09:40
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define nMax 10005
#define mMax 100005
using namespace std;
ifstream fin("apm2.in");
ofstream fout("apm2.out");
vector<pair<int, int> > G[nMax];
int Tata[nMax], Root[nMax], dist[nMax], Lev[nMax], n, m, q, i, tp, a, b, val1, val2;
struct da
{
    int node1;

    int node2;
    int cost;
}Edge[mMax];
int cmp(da o, da p)
{
    return o.cost<p.cost;
}
int getRoot(int node)
{
    if(Root[node]==node)
        return node;
    Root[node]=getRoot(Root[node]);
    return Root[node];
}
void DFS(int node, int tata, int lvl)
{
    Tata[node]=tata;
    Lev[node]=lvl;
    for(vector<pair<int, int> >::iterator it=G[node].begin();it!=G[node].end();it++)
        if(it->first!=tata)
        {
            dist[it->first]=it->second;
            DFS(it->first, node, lvl+1);
        }
}
int LCA(int a, int b)
{
    int Max=0;
    while(a!=b)
    {
        if(Lev[a]>Lev[b])
        {
            Max=max(Max, dist[a]);
            a=Tata[a];
        }
        else
        {
            Max=max(Max, dist[b]);
            b=Tata[b];
        }
    }
    return Max-1;
}
int main()
{
    fin>>n>>m>>q;
    for(i=1;i<=m;i++)
        fin>>Edge[i].node1>>Edge[i].node2>>Edge[i].cost;
    sort(Edge+1, Edge+m+1, cmp);
    for(i=1;i<=n;i++)
        Root[i]=i;
    tp=n-1;
    for(i=1;i<=m&&tp!=0;i++)
    {
        val1=getRoot(Edge[i].node1);
        val2=getRoot(Edge[i].node2);
        if(val1!=val2)
        {
            G[Edge[i].node1].push_back(make_pair(Edge[i].node2, Edge[i].cost));
            G[Edge[i].node2].push_back(make_pair(Edge[i].node1, Edge[i].cost));
            Root[getRoot(Edge[i].node1)]=getRoot(Edge[i].node2);
            tp--;
        }
    }
    DFS(1, -1, 1);
    for(i=1;i<=q;i++)
    {
        fin>>a>>b;
        fout<<LCA(a, b)<<'\n';
    }
    return 0;
}