Pagini recente » Cod sursa (job #3351862) | Cod sursa (job #900516) | Cod sursa (job #1268973) | Cod sursa (job #738842) | Cod sursa (job #3313807)
#include <bits/stdc++.h>
using namespace std;
struct edge {
int u, v, w;
bool operator<(const edge& e) const {
return w < e.w;
}
}e[30005];
struct DSU {
int p[15005], siz[15005];
DSU (int n) {
for (int i = 1; i <= n; i++) {
p[i] = i;
siz[i] = 1;
}
}
int find(int u) {
if (u == p[u]) return u;
return p[u] = find(p[u]);
}
void unite(int u, int v) {
u = find(u);
v = find(v);
if (u == v) return;
if (siz[u] > siz[v]) swap(u, v);
p[u] = v;
siz[v] += siz[u];
}
};
struct query {
int u, v, ind, ans;
};
vector<query> q;
vector<int> adj[15005];
int fin_ans[15005];
void modif(int b, int k, int m, int n) {
DSU dsu(n);
for (auto &key : q) {
key.ans += b;
}
int poz = 0;
vector<query> q1, q2; //q1 sunt cu += b, q2 sunt fara
for (int i = 1; i <= m; i++) {
dsu.unite(e[i].u, e[i].v);
while (poz < k && q[poz].ans == i) {
if (dsu.find(q[poz].u) == dsu.find(q[poz].v)) {
q[poz].ans -= b;
q2.push_back(q[poz]);
}
else
q1.push_back(q[poz]);
poz++;
}
}
while (poz < k) {
q[poz].ans -= b;
q2.push_back(q[poz]);
poz++;
}
//interclasarea
int p1 = 0, p2 = 0;
while (p1 != q1.size() || p2 != q2.size()) {
if (p1 == q1.size()) {
q[p1 + p2] = q2[p2];
p2++;
}
else if (p2 == q2.size()) {
q[p1 + p2] = q1[p1];
p1++;
}
else {
if (q1[p1].ans < q2[p2].ans) {
q[p1 + p2] = q1[p1];
p1++;
}
else {
q[p1 + p2] = q2[p2];
p2++;
}
}
}
}
int main() {
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
int n, m, k;
cin >> n >> m >> k;
for (int i = 1; i <= m; i++) {
cin >> e[i].u >> e[i].v >> e[i].w;
}
sort(e + 1, e + m + 1);
for (int i = 1; i <= k; i++) {
int u, v;
cin >> u >> v;
q.push_back({u, v, i, 0});
}
int b = 1;
while (b * 2 <= m)
b *= 2;
while (b) {
modif(b, k, m, n);
b /= 2;
}
for (auto key : q) {
if (key.u == key.v) {
fin_ans[key.ind] = 0;
continue;
}
fin_ans[key.ind] = e[key.ans + 1].w;
}
for (int i = 1; i <= k; i++) {
cout << fin_ans[i] << '\n';
}
return 0;
}