Cod sursa(job #2674702)

Utilizator Iulia14iulia slanina Iulia14 Data 19 noiembrie 2020 21:08:43
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin ("radiatie.in");
ofstream cout ("radiatie.out");
struct ura{
    int x, y, c;
};
vector <int> lista[15005];
ura muchii[30005];
int cnt[15005];
int set[15005];
int S(int x)
{
    while (set[x])
        x = set[x];
    return x;
}
int cost[15005];
bool cmp(ura a, ura b)
{
    return a.c < b.c;
}
int lvl[15005];
void dfs(int nod)
{
    for (int i = 0; i < lista[nod].size(); i++)
    {
        int x = lista[nod][i];
        lvl[x] = lvl[nod] + 1;
        dfs(x);
    }
}
int main()
{
    int n, m, i, k;
    cin >> n >> m >> k;
    for (i = 1; i <= m; i++)
    {
        int x, y, c;
        cin >> muchii[i].x;
        cin >> muchii[i].y;
        cin >> muchii[i].c;
    }
    sort (muchii + 1, muchii + m + 1, cmp);
    for (i = 1; i <= m; i++)
    {
        int x = muchii[i].x;
        int y = muchii[i].y;
        int c = muchii[i].c;
        int xx = S(x);
        int yy = S(y);
        if (xx != yy)
        {
            set[xx] = yy;
            lista[yy].push_back(xx);
            cost[xx] = c;
        }
    }
    for (i = 1; i <= n; i++)
        if (!set[i])
            dfs(i);
    for (i = 1; i <= k; i++)
    {
        int x, y;
        cin >> x >> y;
        int maxi = 0;

        while(lvl[x] > lvl[y])
		{
			maxi = max(maxi, cost[x]);
			x = set[x];
		}
		while(lvl[y] > lvl[x])
		{
			maxi = max(maxi, cost[y]);
			y = set[y];
		}
		while(x != y)
		{
			maxi = max(maxi, max(cost[x], cost[y]));
			x = set[x];
			y = set[y];
		}
		cout << maxi << '\n';

    }
    return 0;
}