Pagini recente » Cod sursa (job #2868506) | Cod sursa (job #1623054) | Cod sursa (job #1201604) | Cod sursa (job #1547370) | Cod sursa (job #2767113)
#include <stdio.h>
#include <algorithm>
using namespace std;
const int VMAX = 15000, EMAX = 30000;
struct edge
{
int v1, v2, w;
};
bool operator <(const edge &x, const edge &y)
{ return x.w < y.w; }
int boss[VMAX], best[VMAX], h[VMAX];
edge edges[EMAX];
void UF_init(int n);
int UF_find(int e);
void UF_union(int e1, int e2, int l);
int query(int node1, int node2);
int main()
{
int n, m, k, i, node1, node2;
FILE *fin = fopen("radiatie.in", "r");
fscanf(fin, "%d%d%d", &n, &m, &k);
for (i = 0; i < m; i++)
{
fscanf(fin, "%d%d%d", &edges[i].v1, &edges[i].v2, &edges[i].w);
edges[i].v1--;
edges[i].v2--;
}
sort(edges, edges + m);
UF_init(n);
for (i = 0; i < m; i++)
UF_union(edges[i].v1, edges[i].v2, edges[i].w);
FILE *fout = fopen("radiatie.out", "w");
for (i = 0; i < k; i++)
{
fscanf(fin, "%d%d", &node1, &node2);
fprintf(fout, "%d\n", query(node1 - 1, node2 - 1));
}
fclose(fin);
fclose(fout);
return 0;
}
void UF_init(int n)
{
for (int i = 0; i < n; i++)
{
boss[i] = i;
h[i] = 1;
best[i] = 0;
}
}
int UF_find(int e)
{
if (boss[e] == e)
return e;
return UF_find(boss[e]);
}
void UF_union(int e1, int e2, int l)
{
int boss1 = UF_find(e1);
int boss2 = UF_find(e2);
if (boss1 == boss2)
return;
if (h[boss1] > h[boss2])
{
best[boss2] = l;
boss[boss2] = boss1;
}
else if (h[boss1] < h[boss2])
{
best[boss1] = l;
boss[boss1] = boss2;
}
else
{
best[boss1] = l;
boss[boss1] = boss2;
h[boss2]++;
}
}
int query(int node1, int node2)
{
if (node1 == boss[node2])
return best[node2];
else if (node2 == boss[node1])
return best[node1];
while (boss[node1] != boss[node2])
{
if (h[node1] < h[node2])
node1 = boss[node1];
else
node2 = boss[node2];
}
return max(best[node1], best[node2]);
}