Submission #2284142
Source Code Expand
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int n, m;
int q;
/// --- Union Find Library {{{ ///
struct UF {
int n;
vector<int> par, rank;
UF(int n): n(n), par(n, -1), rank(n, 0) {}
int find(int x) {
return par[x] < 0 ? x : par[x] = find(par[x]);
}
int size(int x) {
return -par[find(x)];
}
bool same(int a, int b) {
return find(a) == find(b);
}
void unite(int a, int b) {
a = find(a);
b = find(b);
if(a == b) return;
if(rank[a] > rank[b]) swap(a, b);
par[b] += par[a];
par[a] = b;
if(rank[a] == rank[b]) rank[b]++;
}
};
/// }}}--- ///
using P = tuple<int, int, int>;
const int N = 4000;
vector<int> tree[N];
vector<pair<int, int>> treetwo[N];
int g[N][N];
int par[N][13];
int dist[N][13];
int dep[N];
void dfs(int i, int p = -1, int d = 0) {
par[i][0] = p;
dep[i] = d;
if(p != -1) dist[i][0] = g[i][p];
for(int j : tree[i]) if(j != p) {
dfs(j, i, d + 1);
}
}
void build() {
dfs(0);
for(int i = 1; i < 13; i++) {
for(int j = 0; j < n; j++) {
int p = par[j][i - 1];
int d = dist[j][i - 1];
if(p != -1) {
par[j][i] = par[p][i - 1];
dist[j][i] = max(d, dist[p][i - 1]);
} else par[j][i] = -1;
}
}
}
int lca(int a, int b) {
if(dep[a] > dep[b]) swap(a, b);
// cerr << "dep ab = "<< dep[a] << " , " << dep[b] << endl;
for(int i = 12; i >= 0; i--) {
int p = par[b][i];
if(p != -1 && dep[p] >= dep[a]) b = p;
}
if(a == b) return a;
// cerr << "dep ab = "<< dep[a] << " , " << dep[b] << endl;
// cerr << "ab = "<< a << " , " << b << endl;
for(int i = 12; i >= 0; i--) {
int pa = par[a][i];
int pb = par[b][i];
if(pa != pb) a = pa, b = pb;
}
return par[a][0];
}
int calc(int top, int a) {
int res = 0;
for(int i = 12; i >= 0; i--) {
int p = par[a][i];
if(p != -1 && dep[p] >= dep[top]) res = max(res, dist[a][i]), a = p;
}
return res;
}
int main() {
ios::sync_with_stdio(false), cin.tie(0);
cin >> n >> m;
vector<P> es;
for(int i = 0; i < m; i++) {
int a, b, c; cin >> a >> b >> c;
a--; b--;
es.emplace_back(c, a, b);
}
sort(begin(es), end(es));
UF treeone(n);
ll cost = 0;
// kruskal
for(int i = 0; i < m; i++) {
int a = get<1>(es[i]), b = get<2>(es[i]), c = get<0>(es[i]);
if(!treeone.same(a, b)) {
treeone.unite(a, b);
tree[a].emplace_back(b);
tree[b].emplace_back(a);
treetwo[a].emplace_back(b, c);
treetwo[b].emplace_back(a, c);
g[a][b] = c;
g[b][a] = c;
cost += c;
}
}
// doubling
build();
cin >> q;
for(int i = 0; i < q; i++) {
int s, t; cin >> s >> t;
s--; t--;
int l = lca(s, t);
// cerr << "s = " << s + 1 << " , t = " << t + 1 << " , lca = " << l + 1 << endl;
ll ans = cost;
if(s == l) ans -= calc(s, t);
else if(t == l) ans -= calc(t, s);
else ans -= max(calc(l, s), calc(l, t));
cout << ans << endl;
}
}
Submission Info
Submission Time |
|
Task |
A - Graph |
User |
luma |
Language |
C++14 (GCC 5.4.1) |
Score |
700 |
Code Size |
3112 Byte |
Status |
AC |
Exec Time |
344 ms |
Memory |
69100 KB |
Judge Result
Set Name |
Sample |
subtask1 |
subtask2 |
All |
Score / Max Score |
0 / 0 |
200 / 200 |
300 / 300 |
200 / 200 |
Status |
|
|
|
|
Set Name |
Test Cases |
Sample |
sample_1.txt, sample_2.txt |
subtask1 |
sample_2.txt, subtask_1_1.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_2.txt, subtask_1_3.txt, subtask_1_4.txt, subtask_1_5.txt, subtask_1_6.txt, subtask_1_7.txt, subtask_1_8.txt, subtask_1_9.txt |
subtask2 |
sample_1.txt, sample_2.txt, subtask_1_1.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_2.txt, subtask_1_3.txt, subtask_1_4.txt, subtask_1_5.txt, subtask_1_6.txt, subtask_1_7.txt, subtask_1_8.txt, subtask_1_9.txt, subtask_2_1.txt, subtask_2_2.txt, subtask_2_3.txt, subtask_2_4.txt, subtask_2_5.txt, subtask_2_6.txt, subtask_2_7.txt, subtask_2_8.txt |
All |
sample_1.txt, sample_2.txt, sample_1.txt, sample_2.txt, subtask_1_1.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_2.txt, subtask_1_3.txt, subtask_1_4.txt, subtask_1_5.txt, subtask_1_6.txt, subtask_1_7.txt, subtask_1_8.txt, subtask_1_9.txt, subtask_2_1.txt, subtask_2_2.txt, subtask_2_3.txt, subtask_2_4.txt, subtask_2_5.txt, subtask_2_6.txt, subtask_2_7.txt, subtask_2_8.txt, subtask_3_1.txt, subtask_3_2.txt, subtask_3_3.txt, subtask_3_4.txt, subtask_3_5.txt, subtask_3_6.txt, subtask_3_7.txt, subtask_3_8.txt |
Case Name |
Status |
Exec Time |
Memory |
sample_1.txt |
AC |
1 ms |
512 KB |
sample_2.txt |
AC |
1 ms |
512 KB |
subtask_1_1.txt |
AC |
2 ms |
896 KB |
subtask_1_10.txt |
AC |
81 ms |
64880 KB |
subtask_1_11.txt |
AC |
1 ms |
512 KB |
subtask_1_2.txt |
AC |
28 ms |
62200 KB |
subtask_1_3.txt |
AC |
148 ms |
67692 KB |
subtask_1_4.txt |
AC |
16 ms |
61952 KB |
subtask_1_5.txt |
AC |
17 ms |
61824 KB |
subtask_1_6.txt |
AC |
48 ms |
62964 KB |
subtask_1_7.txt |
AC |
147 ms |
66924 KB |
subtask_1_8.txt |
AC |
16 ms |
61824 KB |
subtask_1_9.txt |
AC |
18 ms |
62016 KB |
subtask_2_1.txt |
AC |
154 ms |
66668 KB |
subtask_2_2.txt |
AC |
153 ms |
66540 KB |
subtask_2_3.txt |
AC |
154 ms |
67180 KB |
subtask_2_4.txt |
AC |
153 ms |
66540 KB |
subtask_2_5.txt |
AC |
22 ms |
61952 KB |
subtask_2_6.txt |
AC |
28 ms |
62204 KB |
subtask_2_7.txt |
AC |
54 ms |
63092 KB |
subtask_2_8.txt |
AC |
154 ms |
67692 KB |
subtask_3_1.txt |
AC |
339 ms |
67692 KB |
subtask_3_2.txt |
AC |
340 ms |
67692 KB |
subtask_3_3.txt |
AC |
202 ms |
63360 KB |
subtask_3_4.txt |
AC |
211 ms |
63296 KB |
subtask_3_5.txt |
AC |
272 ms |
66032 KB |
subtask_3_6.txt |
AC |
307 ms |
67564 KB |
subtask_3_7.txt |
AC |
340 ms |
67692 KB |
subtask_3_8.txt |
AC |
344 ms |
69100 KB |