Pagini recente » Cod sursa (job #2497158) | Cod sursa (job #1680151) | Cod sursa (job #116740) | Cod sursa (job #584364) | Cod sursa (job #1525436)
#include <cstdio>
#include <algorithm>
#include <bitset>
#include <vector>
#define DIM 32768
#define node1 second.first
#define node2 second.second
#define cost first
using namespace std;
int nrNodes, nrEdges, nrQuerys, X, Y, value1, value2;
int Level[DIM], Root[DIM], Distance[DIM], Father[DIM];
vector <int> Edges[DIM], Dist[DIM]; bitset <DIM> Marked;
pair <int, pair <int, int> > InitialEdges[DIM];
int getRoot (int node)
{
return (Root[node] < 0) ? node : getRoot(Root[node]);
}
void DFS (int node, int level)
{
Marked[node] = 1;
Level[node] = level;
for (int it = 0; it < Edges[node].size(); it ++)
{
int nextNode = Edges[node][it];
int nextDif = Dist [node][it];
if (!Marked[nextNode])
{
Distance[nextNode] = nextDif;
Father[nextNode] = node;
DFS (nextNode, level + 1);
}
}
return;
}
int getDistance (int X, int Y)
{
int maxim = 0;
if (Level[X] > Level[Y])
swap (X, Y);
while (Level[Y] != Level[X])
{
maxim = max (maxim, Distance[Y]);
Y = Father[Y];
}
while (X != Y)
{
maxim = max (maxim, Distance[X]);
X = Father[X];
maxim = max (maxim, Distance[Y]);
Y = Father[Y];
}
return maxim;
}
int main ()
{
freopen ("radiatie.in" ,"r", stdin );
freopen ("radiatie.out","w", stdout);
scanf ("%d %d %d", &nrNodes, &nrEdges, &nrQuerys);
for (int i = 1; i <= nrEdges; i ++)
{
scanf ("%d", &InitialEdges[i].node1);
scanf ("%d", &InitialEdges[i].node2);
scanf ("%d", &InitialEdges[i].cost );
}
sort (InitialEdges + 1, InitialEdges + nrEdges + 1);
for (int i = 1; i <= nrNodes; i ++)
Root[i] = -1;
for (int i = 1; i <= nrEdges; i ++)
{
value1 = getRoot (InitialEdges[i].node1);
value2 = getRoot (InitialEdges[i].node2);
if (value1 != value2)
{
switch (Root[value1] - Root[value2] <= 0)
{
case 1: {Root[value1] += Root[value2]; Root[value2] = value1; break;}
case 0: {Root[value2] += Root[value1]; Root[value1] = value2; break;}
}
Edges[InitialEdges[i].node1].push_back(InitialEdges[i].node2);
Edges[InitialEdges[i].node2].push_back(InitialEdges[i].node1);
Dist[InitialEdges[i].node1].push_back(InitialEdges[i].cost);
Dist[InitialEdges[i].node2].push_back(InitialEdges[i].cost);
}
}
for (int i = 1; i <= nrNodes; i ++)
if (Root[i] < 0) DFS (i, 1);
for (int i = 1; i <= nrQuerys; i ++)
{
scanf ("%d %d", &X, &Y);
printf ("%d\n", getDistance(X, Y));
}
fclose (stdin );
fclose (stdout);
return 0;
}