Cod sursa(job #2686563)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 19 decembrie 2020 11:44:25
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

ifstream f("radiatie.in");
ofstream g("radiatie.out");

struct nod
{
    int parent;
    int depth;
    int maxDepth;
    int cost;
} graf[15005];
struct muchie
{
    int x, y, c;
    bool operator<(muchie other)
    {
        if(other.c == c)
            return x < other.x;
        return c < other.c;
    }
} muchii[30005];

int n, m, k;
int root;

int getRoot(int node)
{
    if(graf[node].parent == 0)
        return node;
    return getRoot(graf[node].parent);
}

int setDepth(int node)
{
    if(graf[node].depth != 0)
        return graf[node].depth;
    graf[node].depth = setDepth(graf[node].parent) + 1;
    return graf[node].depth;
}

void read()
{
    f>>n>>m>>k;
    for(int i = 0; i<m; i++)
    {
        f>>muchii[i].x>>muchii[i].y>>muchii[i].c;
    }
    sort(muchii, muchii+m);
}

void buildTree()
{
    for(int i = 0; i<m; i++)
    {
        int r1 = getRoot(muchii[i].x);
        int r2 = getRoot(muchii[i].y);
        if(r1 == r2)
            continue;
        if(graf[r1].maxDepth == graf[r2].maxDepth)
        {
            graf[r2].cost = muchii[i].c;
            graf[r2].parent = r1;
            graf[r1].maxDepth++;
        }
        else if(graf[r1].maxDepth > graf[r2].maxDepth)
        {
            graf[r2].cost = muchii[i].c;
            graf[r2].parent = r1;
        }
        else if(graf[r1].maxDepth < graf[r2].maxDepth)
        {
            graf[r1].cost = muchii[i].c;
            graf[r1].parent = r2;
        }
    }
    root = getRoot(1);
    graf[root].depth = 1;
}

void calcDepth()
{
    for(int i = 1; i<=n; i++)
    {
        setDepth(i);
    }
}

int findCost(int x, int y)
{
    int maxX = 0, maxY = 0;
    while(x != y)
    {
        if(graf[x].depth < graf[y].depth)
        {
            maxY = max(maxY, graf[y].cost);
            y = graf[y].parent;
        }
        else
        {
            maxX = max(maxX, graf[x].cost);
            x = graf[x].parent;
        }
    }
    return max(maxX, maxY);
}

void solve()
{
    int x, y;
    for(int i = 0; i<k; i++)
    {
        f>>x>>y;
        g<<findCost(x, y)<<"\n";
    }
}

int main()
{
    read();
    buildTree();
    calcDepth();
    solve();
    return 0;
}