Pagini recente » Cod sursa (job #2129400) | Cod sursa (job #2307942) | Cod sursa (job #2782748) | Cod sursa (job #1268458) | Cod sursa (job #1743994)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("radiatie.in");
ofstream out("radiatie.out");
const int maxn = 15005;
const int maxm = 30005;
vector <pair <int, int> > arbore[maxm];
int dist[maxn];
int lvl[maxn];
int F[maxn];
struct per
{
int x, y, cost;
};
per muchii[maxm];
int rad(int nod)
{
return (F[nod] < 0) ? nod : rad(F[nod]);
}
void add(int x, int y, int i)
{
if(x == y)
return;
if(F[x] > F[y])
{
F[y] += F[x];
F[x] = y;
dist[x] = muchii[i].cost;
arbore[y].push_back(make_pair(x, muchii[i].cost));
}
else
{
F[x] += F[y];
F[y] = x;
dist[y] = muchii[i].cost;
arbore[x].push_back(make_pair(y, muchii[i].cost));
}
}
int aflare(int x, int y)
{
int ans = 0;
while(x != y)
{
if(lvl[x] < lvl[y])
swap(x, y);
ans = max(ans, dist[x]);
x = F[x];
}
return ans;
}
inline bool cmp(per a, per b)
{
return a.cost < b.cost;
}
void dfs(int nod)
{
if(!arbore[nod].size())
return;
for(auto it : arbore[nod])
{
lvl[it.first] = lvl[nod] + 1;
dfs(it.first);
}
}
int main()
{
int n, m, k;
in >> n >> m >> k;
for(int i = 1; i <= m; i++)
in >> muchii[i].x >> muchii[i].y >> muchii[i].cost;
sort(muchii + 1, muchii + m + 1, cmp);
for(int i = 1; i <= n; i++)
F[i] = -1;
for(int i = 1; i <= m; i++)
add(rad(muchii[i].x), rad(muchii[i].y), i);
lvl[rad(1)] = 1;
dfs(rad(1));
for(int i = 1; i <= k; i++)
{
int x, y;
in >> x >> y;
out << aflare(x, y) << "\n";
}
return 0;
}