Cod sursa(job #3040897)

Utilizator Andrei_ierdnANeculau Rares-Andrei Andrei_ierdnA Data 30 martie 2023 16:30:15
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda tot_ Marime 2.21 kb
#include <fstream>
#include <set>
#include <algorithm>

using namespace std;

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

struct Edge
{
    int x, y, c;
};

struct Query
{
    int x, y;
};

int n, m, k, i, dsu[15100];
set<int> smalltolarge[15100];
Edge edges[30100];
Query queries[15100];
int qans[15100];

int dsuGetRoot (int node)
{
    if (!dsu[node])
        return node;
    return dsu[node] = dsuGetRoot(dsu[node]);
}

void dsuMerge (int a, int b)
{
    a = dsuGetRoot(a);
    b = dsuGetRoot(b);
    if (a != b) {
        if (smalltolarge[a].size() <= smalltolarge[b].size()) {
            while (!smalltolarge[a].empty()) {
                int q = (*smalltolarge[a].begin());
                smalltolarge[a].erase(smalltolarge[a].begin());
                if (smalltolarge[b].count(q)) {
                    smalltolarge[b].erase(q);
                    qans[q] = edges[i].c;
                }
                else {
                    smalltolarge[b].insert(q);
                }
            }
            dsu[a] = b;
        }
        else {
            while (!smalltolarge[b].empty()) {
                int q = (*smalltolarge[b].begin());
                smalltolarge[b].erase(smalltolarge[b].begin());
                if (smalltolarge[a].count(q)) {
                    smalltolarge[a].erase(q);
                    qans[q] = edges[i].c;
                }
                else {
                    smalltolarge[a].insert(q);
                }
            }
            dsu[b] = a;
        }
    }
}

bool edgeCmp (const Edge &a, const Edge &b)
{
    if (a.c < b.c)
        return true;
    return false;
}

int main()
{
    f >> n >> m >> k;
    for (i = 1; i <= m; i++) {
        f >> edges[i].x >> edges[i].y >> edges[i].c;
    }
    for (i = 1; i <= k; i++) {
        f >> queries[i].x >> queries[i].y;
        smalltolarge[queries[i].x].insert(i);
        smalltolarge[queries[i].y].insert(i);
    }
    sort(edges+1, edges+m+1, edgeCmp);
    for (i = 1; i <= m; i++) {
        dsuMerge(edges[i].x, edges[i].y);
    }
    for (i = 1; i <= k; i++) {
        g << qans[i] << '\n';
    }
    f.close();
    g.close();
    return 0;
}