Pagini recente » Cod sursa (job #1507197) | Cod sursa (job #184320) | Cod sursa (job #409668) | Cod sursa (job #2307233) | Cod sursa (job #257586)
Cod sursa(job #257586)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef struct {
int u, v, w;
} Muchie;
int N, M, K;
Muchie m[30000];
int P[15001], D[15001];
int mrkd[15001];
bool lt(const Muchie &a, const Muchie &b) {
return (a.w < b.w);
}
int find_progenitor(int u) {
for (; P[u] != u; u = P[u])
;
return u;
}
void mark_up(int u, int w) {
mrkd[u] += w;
if (u != P[u])
mark_up(P[u], w);
}
int find_max(int u) {
int m = 0;
for (; mrkd[u] != 2; u = P[u])
m = max(m, D[u]);
return m;
}
void gen_apm() {
int i, u, v;
sort(m, m+M, lt);
/*for (i = 0; i < M; ++i)
printf("%d %d %d\n", m[i].u, m[i].v, m[i].w);*/
for (i = 1; i <= N; ++i)
P[i] = i;
for (i = 0; i < M; ++i) { /* maybe stop after adding N-1 edges? */
u = find_progenitor(m[i].u);
v = find_progenitor(m[i].v);
if (u != v) {
P[v] = u;
D[v] = m[i].w;
}
}
}
int main(int argc, char *argv[]) {
int i, x, y;
FILE *fi = fopen("radiatie.in", "r");
fscanf(fi, "%d %d %d", &N, &M, &K);
for (i = 0; i < M; ++i)
fscanf(fi, "%d %d %d", &m[i].u, &m[i].v, &m[i].w);
gen_apm();
FILE *fo = fopen("radiatie.out", "w");
for (i = 0; i < K; ++i) {
fscanf(fi, "%d %d", &x, &y);
mark_up(x, 1);
mark_up(y, 1);
fprintf(fo, "%d\n", max(find_max(x), find_max(y)));
mark_up(x, -1);
mark_up(y, -1);
}
fclose(fo);
fclose(fi);
return 0;
}