Pagini recente » Istoria paginii runda/aparare/clasament | Cod sursa (job #1294487) | Cod sursa (job #2009928) | Istoria paginii runda/gg1 | Cod sursa (job #301024)
Cod sursa(job #301024)
using namespace std;
#include <cstdio>
#include <algorithm>
#define Nmax 15010
#define Mmax 30010
struct muchie {int x, y, c;} M[Mmax];
int n, m, k, i, aux, t1, t2, T[Nmax], D[Nmax], sol, viz[Nmax], x, y, cm[Mmax];
FILE *f = fopen("radiatie.in", "r");
int cmp(muchie a, muchie b){
return a.c < b.c;
}
void citire(){
fscanf(f,"%d %d %d", &n, &m, &k);
for(i = 1; i <= m; i++)
fscanf(f,"%d %d %d", &M[i].x, &M[i].y, &M[i].c);
}
int tata(int t){
while( T[t] > 0 )
t = T[t];
return t;
}
void kruskal(){
sort(M + 1, M + 1 + m, cmp);
for(i = 1; i <= n; i++)
T[i] = -1;
for(i = 1; i <= m; i++){
t1 = tata(M[i].x); t2 = tata(M[i].y);
if( t1 != t2 ){
if( -T[t1] > -T[t2] ){
T[t1]+= T[t2];
T[t2] = t1;
cm[t2] = M[i].c;
}
else{
T[t2]+= T[t1];
T[t1] = t2;
cm[t1] = M[i].c;
}
}
}
}
void parc(int nod){
if( viz[nod] ) return ;
viz[nod] = 1;
if(T[nod] < 0) {D[nod] = 1; return;}
parc(T[nod]);
D[nod] = D[T[nod]] + 1;
}
void solve(){
FILE *g = fopen("radiatie.out", "w");
for(i = 1; i <= n; i++)
if( !viz[i] )
parc(i);
for(i = 1; i <= k; i++){
fscanf(f,"%d %d",&x, &y);
sol = 0;
if( D[x] < D[y] ){aux = x; x = y; y = aux;}
while( D[x] > D[y] ){
sol = max(sol, cm[x]);
x = T[x];
}
while( x != y ){
sol = max(sol, cm[x]);
x = T[x];
sol = max(sol, cm[x]);
y = T[y];
}
fprintf(g,"%d\n",sol);
}
fclose(f);
fclose(g);
}
int main(){
citire();
kruskal();
solve();
}