Pagini recente » Cod sursa (job #2838936) | Cod sursa (job #2781557) | Cod sursa (job #2413428) | Cod sursa (job #2528074) | Cod sursa (job #1043674)
#include <fstream>
#include <algorithm>
#include <vector>
#define In "radiatie.in"
#define Out "radiatie.out"
#define edge pair < int ,pair < int ,int > >
#define Nmax 15004
#define Mmax 30004
#define x second.first
#define y second.second
#define cost first
using namespace std;
edge e[Mmax];
int n, m, niv[Nmax] ,c[Nmax];
vector < int > Tree[Nmax];
int Father[Nmax];
struct DisjointSets
{
inline void Buid()
{
for(int i = 1;i <= n; ++i)
Father[i] = i;
}
inline int Find(int node)
{
while(node!=Father[node])
node = Father[node];
return node;
}
inline void Union(const int X,const int Y)
{
Father[X] = Y;
}
};
DisjointSets S;
inline void APM()
{
sort(e+1,e+m+1);
int i ,X ,Y;
S.Buid();
for(i = 1;i <= m; ++i)
{
X = S.Find(e[i].x) ;
Y = S.Find(e[i].y) ;
if(X != Y)
{
S.Union(X,Y);
Tree[Y].push_back(X);
c[X] = e[i].cost;
}
}
}
inline void DFS(const int node,const int Niv)
{
niv[node] = Niv;
for(vector < int > ::iterator it=Tree[node].begin(); it!= Tree[node].end() ;++it)
DFS(*it,Niv+1);
}
int main()
{
int i, k, sol ,X ,Y;
ifstream f(In);
ofstream g(Out);
f >> n >> m >> k;
for(i = 1 ; i <= m; ++i)
f >> e[i].x >> e[i].y >> e[i].cost;
APM();
for(i = 1;i <= n; ++i)
if(Father[i] == i)
{
DFS(i,0);
break;
}
for( ; k; --k)
{
f >> X >> Y ;
sol = 0;
while(niv[X] > niv[Y])
{
sol = max(sol,c[X]);
X = Father[X];
}
while(niv[X] < niv[Y])
{
sol = max(sol,c[Y]);
Y = Father[Y];
}
while(X != Y)
{
sol = max(sol,max(c[X],c[Y]));
X = Father[X];
Y = Father[Y];
}
g<<sol<<"\n";
}
f.close();
g.close();
return 0;
}