Pagini recente » Istoria paginii runda/rezolvarijudeteanaliceu/clasament | Cod sursa (job #1375010) | Cod sursa (job #2575676) | Cod sursa (job #2372109) | Cod sursa (job #218803)
Cod sursa(job #218803)
#include<stdio.h>
#include<set>
#include<algorithm>
using namespace std;
#define x first
#define y second
#define lg 100005
int n, m, k, i, cnt[lg], h[lg], rsp[lg], cost[lg], tata[lg], x, y;
pair<int, pair <int, int> > v[lg];
void adg(int x, int y){
if (x == y)
return ;
if (h[x] < h[y])
tata[x] = y, cost[x] = v[i].x, cnt[y] += cnt[x];
else{
if (h[x] == h[y])
h[x] ++;
tata[y] = x, cost[y] = v[i].x, cnt[x] += cnt[y];
}
}
int find(int x){
int r = x, val;
for (; tata[r]; r = tata[r])
val = cost[r];
while (tata[x]){
int k = tata[x];
tata[x] = r;
cost[x] = val;
x = k;
}
return r;
}
int main()
{
freopen("radiatie.in", "rt", stdin);
freopen("radiatie.out", "wt", stdout);
scanf("%d%d%d", &n, &m, &k);
for (i = 1; i <= m; i ++)
scanf("%d%d%d", &v[i].y.x, &v[i].y.y, &v[i].x);
for (i = 1; i <= n; i ++)
cnt[i] = 1;
sort(v+1, v+n+1);
for (i = 1; i <= m; i ++){
adg(find(v[i].y.x), find(v[i].y.y));
// printf("%d\n", cnt[find(1)]);
if (cnt[find(1)] == n)
break;
}
printf("%d\n", i);
for (i = 1; i <= k; i ++){
scanf("%d%d", &x, &y);
set<int> q;
rsp[x] = 0; q.insert(x);
for (; tata[x]; x = tata[x]){
rsp[tata[x]] = cost[x];
q.insert(tata[x]);
}
if (q.find(y) != q.end()){
printf("%d\n", rsp[y]);
continue;
}
for (; tata[y]; y = tata[y]){
rsp[tata[y]] = max(rsp[tata[y]], cost[y]);
if (q.find(tata[y]) != q.end()){
printf("%d\n", rsp[tata[y]]);
break;
}
}
}
return 0;
}