Pagini recente » Monitorul de evaluare | Cod sursa (job #407890) | Cod sursa (job #1443485) | Istoria paginii runda/iconcurs13/clasament | Cod sursa (job #1554889)
#include <algorithm>
#include <fstream>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
const int nmax= 15000;
const int mmax= 30000;
struct str {
int x, y, d;
};
bool u[nmax+1];
int n, m, k;
int r[nmax+1], l[nmax+1], d[nmax+1];
str v[mmax+1];
bool cmp( str x, str y ) {
return x.d<y.d;
}
int root( int x ) {
while ( x!=r[x] ) {
x= r[x];
}
return x;
}
int main( ) {
int q;
fin>>n>>m>>q;
for ( int i= 1; i<=m; ++i ) {
fin>>v[i].x>>v[i].y>>v[i].d;
}
sort( v+1, v+m+1, cmp );
for ( int i= 1; i<=n; ++i ) {
r[i]= i;
}
for ( int i= 1; i<=m; ++i ) {
int x= root(v[i].x), y= root(v[i].y);
if ( x!=y ) {
r[y]= x;
d[y]= v[i].d;
}
}
for ( int i= 1; i<=n; ++i ) {
for ( int j= i; j!=r[j]; j= r[j] ) {
++l[i];
}
}
for ( int i= 1; i<=q; ++i ) {
int x, y;
fin>>x>>y;
int sol= 0;
while ( l[x]>l[y] ) {
sol= max(sol, d[x]);
x= r[x];
}
while ( l[x]<l[y] ) {
sol= max(sol, d[y]);
y= r[y];
}
while ( x!=y ) {
sol= max(sol, max(d[x], d[y]));
x= r[x], y= r[y];
}
fout<<sol<<"\n";
}
return 0;
}