Pagini recente » Cod sursa (job #1461406) | Cod sursa (job #312777) | Cod sursa (job #896210) | Cod sursa (job #75942) | Cod sursa (job #2979335)
#include <bits/stdc++.h>
#define N 30008
#define M 1000008
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int n, m, q;
int Rang[N];
int T[N];
vector< pair<int, int> > g[N];
int ET[2 * N];
int last[2 * N];
int R[2 * N][20];
int Log[2 * N];
int f[N];
int finv[N];
int depth[N];
bool viz[N];
int et;
struct muchii
{
int x, y, c;
} much[N];
void Citire()
{
int i;
int x, y, c;
fin >> n >> m >> q;
for( i=1; i<=m; i++ )
{
fin >> x >> y >> c;
much[i].x = x;
much[i].y = y;
much[i].c = c;
}
for( i=1; i<=n; i++ )
Rang[i] = 1, T[i] = i;
}
void DFS( int x )
{
et++;
f[x] = et;
finv[et] = x;
viz[x] = 1;
ET[++m] = f[x];
last[f[x]] = m;
for( auto y : g[x] )
if( !viz[y.first] )
{
depth[y.first] = depth[x] + 1;
T[y.first] = x;
DFS(y.first);
ET[++m] = f[x];
last[f[x]] = m;
}
}
void Precalculare()
{
int i, j;
for( i=2; i<=m; i++ )
Log[i] = Log[i / 2] + 1;
for( i=1; i<=m; i++ )
R[i][0] = ET[i];
for( j=1; j<=Log[m]; j++ )
for( i=1; i + (1 << (j - 1)) <= m; i++ )
R[i][j] = min( R[i][j - 1], R[i + (1 << (j - 1))][j - 1] );
}
int lca( int x, int y )
{
x = f[x];
y = f[y];
int a, b;
int k;
a = last[x];
b = last[y];
if( a > b )
swap(a, b);
k = Log[ b - a + 1 ];
return finv[min( R[a][k], R[b - (1 << k) + 1][k] )];
}
inline bool cmp( muchii a, muchii b )
{
return a.c < b.c;
}
int Find( int x )
{
return ( T[x] == x ) ? x : Find( T[x] );
}
void Union( int x, int y )
{
int xx = Find(x);
int yy = Find(y);
if( Rang[xx] > Rang[yy] )
swap( xx, yy );
T[xx] = yy;
Rang[yy] += Rang[xx];
}
void Rezolvare()
{
int i;
sort( much + 1, much + m + 1, cmp );
for( i=1; i<=m; i++ )
{
int x = much[i].x;
int y = much[i].y;
int c = much[i].c;
if( Find(x) != Find(y) )
{
Union(x, y);
g[x].push_back( make_pair(y, c) );
g[y].push_back( make_pair(x, c) );
}
}
for( i=1; i<=n; i++ )
{
cout << i << ": ";
for( auto y : g[i] )
cout << y.first << " ";
cout << "\n";
}
DFS(1);
Precalculare();
int x, y;
while( q-- )
{
fin >> x >> y;
int k = lca(x, y);
cout << x << " " << y << " " << k << "\n";
}
}
int main()
{
Citire();
Rezolvare();
return 0;
}