Cod sursa(job #1525436)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 15 noiembrie 2015 01:07:50
Problema Radiatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <cstdio>
#include <algorithm>
#include <bitset>
#include <vector>

#define DIM 32768
#define node1 second.first
#define node2 second.second
#define cost first
using namespace std;

int nrNodes, nrEdges, nrQuerys, X, Y, value1, value2;
int Level[DIM], Root[DIM], Distance[DIM], Father[DIM];
vector <int> Edges[DIM], Dist[DIM]; bitset <DIM> Marked;
pair <int, pair <int, int> > InitialEdges[DIM];

int getRoot (int node)
{
    return (Root[node] < 0) ? node : getRoot(Root[node]);
}

void DFS (int node, int level)
{
    Marked[node] = 1;
    Level[node] = level;

    for (int it = 0; it < Edges[node].size(); it ++)
    {
        int nextNode = Edges[node][it];
        int nextDif  = Dist [node][it];

        if (!Marked[nextNode])
        {
            Distance[nextNode] = nextDif;
            Father[nextNode] = node;

            DFS (nextNode, level + 1);
        }
    }

    return;
}

int getDistance (int X, int Y)
{
    int maxim = 0;

    if (Level[X] > Level[Y])
        swap (X, Y);

    while (Level[Y] != Level[X])
    {
        maxim = max (maxim, Distance[Y]);
        Y = Father[Y];
    }

    while (X != Y)
    {
        maxim = max (maxim, Distance[X]);
        X = Father[X];

        maxim = max (maxim, Distance[Y]);
        Y = Father[Y];
    }

    return maxim;
}

int main ()
{
    freopen ("radiatie.in" ,"r", stdin );
    freopen ("radiatie.out","w", stdout);

    scanf ("%d %d %d", &nrNodes, &nrEdges, &nrQuerys);

    for (int i = 1; i <= nrEdges; i ++)
    {
        scanf ("%d", &InitialEdges[i].node1);
        scanf ("%d", &InitialEdges[i].node2);
        scanf ("%d", &InitialEdges[i].cost );
    }

    sort (InitialEdges + 1, InitialEdges + nrEdges + 1);

    for (int i = 1; i <= nrNodes; i ++)
        Root[i] = -1;

    for (int i = 1; i <= nrEdges; i ++)
    {
        value1 = getRoot (InitialEdges[i].node1);
        value2 = getRoot (InitialEdges[i].node2);

        if (value1 != value2)
        {
            switch (Root[value1] - Root[value2] <= 0)
            {
                case 1: {Root[value1] += Root[value2]; Root[value2] = value1; break;}
                case 0: {Root[value2] += Root[value1]; Root[value1] = value2; break;}
            }

            Edges[InitialEdges[i].node1].push_back(InitialEdges[i].node2);
            Edges[InitialEdges[i].node2].push_back(InitialEdges[i].node1);

            Dist[InitialEdges[i].node1].push_back(InitialEdges[i].cost);
            Dist[InitialEdges[i].node2].push_back(InitialEdges[i].cost);
        }
    }

    for (int i = 1; i <= nrNodes; i ++)
        if (Root[i] < 0) DFS (i, 1);

    for (int i = 1; i <= nrQuerys; i ++)
    {
        scanf ("%d %d", &X, &Y);
        printf ("%d\n", getDistance(X, Y));
    }

    fclose (stdin );
    fclose (stdout);

    return 0;
}