Pagini recente » Cod sursa (job #1204316) | Cod sursa (job #600436) | Cod sursa (job #1739452) | Cod sursa (job #1905605) | Cod sursa (job #701270)
Cod sursa(job #701270)
#include <cstdio>
#include <algorithm>
#define MAXN 15001
using namespace std;
struct edge {
unsigned short x, y;
int cost;
} edges[MAXN << 1];
int n, m, k, edgeCount;
int parent[MAXN], rank[MAXN], costToParent[MAXN], lastWalk[MAXN];
inline bool compare(const edge &a, const edge &b)
{
return a.cost < b.cost;
}
int findSet(int vertex)
{
if (parent[vertex] != 0)
return findSet(parent[vertex]);
return vertex;
}
void link(int v1, int v2, int cost)
{
if (rank[v1] > rank[v2])
{
parent[v2] = v1;
costToParent[v2] = cost;
}
else
{
parent[v1] = v2;
costToParent[v1] = cost;
if (rank[v1] == rank[v2])
rank[v2]++;
}
}
int query(int a, int b, int color)
{
int max = 0, first = a;
while (parent[a] != 0)
{
lastWalk[a] = color;
a = parent[a];
}
while (parent[b] != 0 && lastWalk[b] != color)
{
if (max < costToParent[b])
max = costToParent[b];
b = parent[b];
}
while (first != b)
{
if (max < costToParent[first])
max = costToParent[first];
first = parent[first];
}
return max;
}
int main()
{
freopen("radiatie.out", "w", stdout);
freopen("radiatie.in", "r", stdin);
scanf("%d%d%d", &n, &m, &k);
for (int i = 1 ; i<= m ; ++i)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
edges[++edgeCount].x = a;
edges[edgeCount].y = b;
edges[edgeCount].cost = c;
}
sort(edges + 1, edges + m + 1, compare);
for (int i = 1 ; i <= m ; ++i)
{
int s1, s2;
if ((s1 = findSet(edges[i].x)) != (s2 = findSet(edges[i].y)))
link(s1, s2, edges[i].cost);
}
for (int i = 1 ; i <= k ; ++i)
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", query(a, b, i));
}
return 0;
}