#include <bits/stdc++.h>
const int32_t MAX_N = 1e5;
const int32_t LOG_MAX_N = 17;
const int32_t MAX_M = 5e5;
const int32_t INF = 2e9;
class Graph {
private:
struct Node {
bool isVisited;
int32_t id, dist;
std::vector< int32_t > v;
Node() {
dist = INF;
}
};
struct Edge {
int32_t w;
Node *u, *v;
Node* Get(Node *x) const {
if(u == x) {
return v;
}
else {
return u;
}
}
};
public:
int32_t cntNodes, cntEdges;
Node nodes[MAX_N + 5];
Edge edges[MAX_M + 5];
void Init(int32_t _cntNodes, int32_t _cntEdges) {
cntNodes = _cntNodes;
cntEdges = _cntEdges;
for(int32_t i = 1; i <= _cntNodes; i++) {
nodes[i].id = i;
}
}
void AddEdge(Node *u, Node *v, int32_t w, int32_t ind) {
u->v.push_back(ind);
v->v.push_back(ind);
edges[ind] = { w, u, v };
}
friend bool operator< (const std::pair< int32_t, Node* > &x, const std::pair< int32_t, Node* > &y) {
return x.first > y.first;
}
void Dijkstra(const std::vector< int32_t > &st) {
std::priority_queue< std::pair< int32_t, Node* > > pq;
for(auto &x : st) {
nodes[x].dist = 0;
pq.push({ 0, &nodes[x] });
}
while(!pq.empty()) {
Node *curr = pq.top().second;
pq.pop();
if(curr->isVisited) {
continue;
}
curr->isVisited = true;
for(auto &x : curr->v) {
Node *nxtNode = edges[x].Get(curr);
if(!nxtNode->isVisited && nxtNode->dist > curr->dist + edges[x].w) {
nxtNode->dist = curr->dist + edges[x].w;
pq.push({ nxtNode->dist, nxtNode });
}
}
}
}
};
struct Edge {
int32_t u, v, minDist;
bool operator< (const Edge &other) const {
return minDist > other.minDist;
}
};
Graph g;
Edge edges[MAX_M + 5];
class DSU {
private:
int32_t parent[MAX_N + 5], siz[MAX_N + 5];
public:
void Init(int32_t _cntNodes) {
for(int32_t i = 1; i <= _cntNodes; i++) {
parent[i] = i;
siz[i] = 1;
}
}
int32_t Find(int32_t x) {
if(parent[x] == x) {
return x;
}
else {
parent[x] = Find(parent[x]);
return parent[x];
}
}
void Unite(int32_t x, int32_t y) {
if(siz[x] > siz[y]) {
parent[y] = x;
}
else if(siz[x] < siz[y]) {
parent[x] = y;
}
else {
parent[y] = x;
siz[x] += siz[y];
}
}
};
DSU dsu;
class Tree {
private:
struct Node {
bool isVisited;
int32_t id, inTime, outTime;
std::pair< Node*, int32_t > ancs[LOG_MAX_N + 5];
std::vector< std::pair< Node*, int32_t > > v;
bool IsAncOf(Node *x) const {
if(inTime <= x->inTime && outTime >= x->outTime) {
return true;
}
return false;
}
};
public:
int32_t cntNodes;
Node nodes[MAX_N + 5];
void Init(int32_t _cntNodes) {
cntNodes = _cntNodes;
for(int32_t i = 1; i <= _cntNodes; i++) {
nodes[i].id = i;
for(int32_t j = 0; j < LOG_MAX_N; j++) {
nodes[i].ancs[j] = { nullptr, 0 };
}
}
}
void AddEdge(Node *u, Node *v, int32_t w) {
u->v.push_back({ v, w });
v->v.push_back({ u, w });
}
void PrecomputeDfs(Node *nd, int32_t &dfsTime) {
nd->isVisited = true;
nd->inTime = dfsTime++;
for(auto &x : nd->v) {
if(!x.first->isVisited) {
PrecomputeDfs(x.first, dfsTime);
}
else {
nd->ancs[0] = { x.first, x.second };
}
}
nd->outTime = dfsTime - 1;
}
void PrecomputeAncs() {
for(int32_t j = 1; j < LOG_MAX_N; j++) {
for(int32_t i = 1; i <= cntNodes; i++) {
if(nodes[i].ancs[j - 1].first != nullptr) {
nodes[i].ancs[j] = {
nodes[i].ancs[j - 1].first->ancs[j - 1].first,
std::min(nodes[i].ancs[j - 1].second, nodes[i].ancs[j - 1].first->ancs[j - 1].second)
};
}
}
}
}
int32_t GetMinDistBetween(Node *u, Node *v) {
int32_t ans = INF;
for(int32_t i = LOG_MAX_N - 1; i >= 0; i--) {
if(u->ancs[i].first != nullptr && !u->ancs[i].first->IsAncOf(v)) {
ans = std::min(ans, u->ancs[i].second);
u = u->ancs[i].first;
}
}
for(int32_t i = LOG_MAX_N - 1; i >= 0; i--) {
if(v->ancs[i].first != nullptr && !v->ancs[i].first->IsAncOf(u)) {
ans = std::min(ans, v->ancs[i].second);
v = v->ancs[i].first;
}
}
if(!u->IsAncOf(v)) {
ans = std::min(ans, u->ancs[0].second);
}
if(!v->IsAncOf(u)) {
ans = std::min(ans, v->ancs[0].second);
}
return ans;
}
};
Tree t;
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int32_t n, m;
std::cin >> n >> m;
g.Init(n, m);
for(int32_t i = 0; i < m; i++) {
int32_t u, v, w;
std::cin >> u >> v >> w;
g.AddEdge(&g.nodes[u], &g.nodes[v], w, i);
}
int32_t k;
std::cin >> k;
std::vector< int32_t > special(k);
for(int32_t i = 0; i < k; i++) {
std::cin >> special[i];
}
g.Dijkstra(special);
for(int32_t i = 0; i < m; i++) {
edges[i] = { g.edges[i].u->id, g.edges[i].v->id, std::min(g.edges[i].u->dist, g.edges[i].v->dist) };
}
std::sort(edges, edges + m);
dsu.Init(n);
t.Init(n);
for(int32_t i = 0; i < m; i++) {
int32_t parU = dsu.Find(edges[i].u);
int32_t parV = dsu.Find(edges[i].v);
if(parU != parV) {
dsu.Unite(parU, parV);
t.AddEdge(&t.nodes[edges[i].u], &t.nodes[edges[i].v], edges[i].minDist);
}
}
int32_t dfsTime = 0;
t.PrecomputeDfs(&t.nodes[1], dfsTime);
t.PrecomputeAncs();
int32_t q;
std::cin >> q;
for(int32_t i = 0; i < q; i++) {
int32_t u, v;
std::cin >> u >> v;
std::cout << t.GetMinDistBetween(&t.nodes[u], &t.nodes[v]) << '\n';
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
38 ms |
42616 KB |
Output is correct |
2 |
Correct |
39 ms |
42872 KB |
Output is correct |
3 |
Correct |
39 ms |
42744 KB |
Output is correct |
4 |
Correct |
39 ms |
42616 KB |
Output is correct |
5 |
Correct |
39 ms |
42744 KB |
Output is correct |
6 |
Correct |
39 ms |
42744 KB |
Output is correct |
7 |
Correct |
38 ms |
42620 KB |
Output is correct |
8 |
Correct |
38 ms |
42616 KB |
Output is correct |
9 |
Correct |
38 ms |
42872 KB |
Output is correct |
10 |
Correct |
39 ms |
42792 KB |
Output is correct |
11 |
Correct |
39 ms |
42872 KB |
Output is correct |
12 |
Correct |
39 ms |
42872 KB |
Output is correct |
13 |
Correct |
42 ms |
42804 KB |
Output is correct |
14 |
Correct |
39 ms |
42756 KB |
Output is correct |
15 |
Correct |
39 ms |
42740 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
38 ms |
42616 KB |
Output is correct |
2 |
Correct |
39 ms |
42872 KB |
Output is correct |
3 |
Correct |
39 ms |
42744 KB |
Output is correct |
4 |
Correct |
39 ms |
42616 KB |
Output is correct |
5 |
Correct |
39 ms |
42744 KB |
Output is correct |
6 |
Correct |
39 ms |
42744 KB |
Output is correct |
7 |
Correct |
38 ms |
42620 KB |
Output is correct |
8 |
Correct |
38 ms |
42616 KB |
Output is correct |
9 |
Correct |
38 ms |
42872 KB |
Output is correct |
10 |
Correct |
39 ms |
42792 KB |
Output is correct |
11 |
Correct |
39 ms |
42872 KB |
Output is correct |
12 |
Correct |
39 ms |
42872 KB |
Output is correct |
13 |
Correct |
42 ms |
42804 KB |
Output is correct |
14 |
Correct |
39 ms |
42756 KB |
Output is correct |
15 |
Correct |
39 ms |
42740 KB |
Output is correct |
16 |
Correct |
269 ms |
53884 KB |
Output is correct |
17 |
Correct |
659 ms |
73968 KB |
Output is correct |
18 |
Correct |
77 ms |
45492 KB |
Output is correct |
19 |
Correct |
232 ms |
55624 KB |
Output is correct |
20 |
Correct |
665 ms |
73936 KB |
Output is correct |
21 |
Correct |
403 ms |
59900 KB |
Output is correct |
22 |
Correct |
297 ms |
59296 KB |
Output is correct |
23 |
Correct |
677 ms |
73796 KB |
Output is correct |
24 |
Correct |
670 ms |
73816 KB |
Output is correct |
25 |
Correct |
700 ms |
73900 KB |
Output is correct |
26 |
Correct |
245 ms |
55476 KB |
Output is correct |
27 |
Correct |
242 ms |
55512 KB |
Output is correct |
28 |
Correct |
229 ms |
55372 KB |
Output is correct |
29 |
Correct |
235 ms |
55528 KB |
Output is correct |
30 |
Correct |
252 ms |
55584 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
39 ms |
42616 KB |
Output is correct |
2 |
Correct |
38 ms |
42596 KB |
Output is correct |
3 |
Correct |
38 ms |
42616 KB |
Output is correct |
4 |
Correct |
39 ms |
42616 KB |
Output is correct |
5 |
Correct |
37 ms |
42616 KB |
Output is correct |
6 |
Correct |
38 ms |
42620 KB |
Output is correct |
7 |
Correct |
38 ms |
42628 KB |
Output is correct |
8 |
Correct |
38 ms |
42572 KB |
Output is correct |
9 |
Correct |
39 ms |
42616 KB |
Output is correct |
10 |
Correct |
38 ms |
42616 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
336 ms |
59516 KB |
Output is correct |
2 |
Correct |
652 ms |
73412 KB |
Output is correct |
3 |
Correct |
624 ms |
73464 KB |
Output is correct |
4 |
Correct |
203 ms |
57128 KB |
Output is correct |
5 |
Correct |
623 ms |
73432 KB |
Output is correct |
6 |
Correct |
623 ms |
73560 KB |
Output is correct |
7 |
Correct |
617 ms |
73448 KB |
Output is correct |
8 |
Correct |
637 ms |
73448 KB |
Output is correct |
9 |
Correct |
609 ms |
73416 KB |
Output is correct |
10 |
Correct |
595 ms |
73324 KB |
Output is correct |
11 |
Correct |
614 ms |
73540 KB |
Output is correct |
12 |
Correct |
635 ms |
73504 KB |
Output is correct |
13 |
Correct |
614 ms |
73488 KB |
Output is correct |
14 |
Correct |
599 ms |
73516 KB |
Output is correct |
15 |
Correct |
621 ms |
73472 KB |
Output is correct |
16 |
Correct |
622 ms |
73336 KB |
Output is correct |
17 |
Correct |
599 ms |
73556 KB |
Output is correct |
18 |
Correct |
631 ms |
73424 KB |
Output is correct |
19 |
Correct |
204 ms |
58216 KB |
Output is correct |
20 |
Correct |
622 ms |
73392 KB |
Output is correct |
21 |
Correct |
596 ms |
73660 KB |
Output is correct |
22 |
Correct |
195 ms |
55108 KB |
Output is correct |
23 |
Correct |
208 ms |
55716 KB |
Output is correct |
24 |
Correct |
202 ms |
55220 KB |
Output is correct |
25 |
Correct |
191 ms |
55148 KB |
Output is correct |
26 |
Correct |
217 ms |
55648 KB |
Output is correct |
27 |
Correct |
212 ms |
58048 KB |
Output is correct |
28 |
Correct |
182 ms |
55288 KB |
Output is correct |
29 |
Correct |
207 ms |
57464 KB |
Output is correct |
30 |
Correct |
185 ms |
55108 KB |
Output is correct |
31 |
Correct |
207 ms |
57592 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
38 ms |
42616 KB |
Output is correct |
2 |
Correct |
39 ms |
42872 KB |
Output is correct |
3 |
Correct |
39 ms |
42744 KB |
Output is correct |
4 |
Correct |
39 ms |
42616 KB |
Output is correct |
5 |
Correct |
39 ms |
42744 KB |
Output is correct |
6 |
Correct |
39 ms |
42744 KB |
Output is correct |
7 |
Correct |
38 ms |
42620 KB |
Output is correct |
8 |
Correct |
38 ms |
42616 KB |
Output is correct |
9 |
Correct |
38 ms |
42872 KB |
Output is correct |
10 |
Correct |
39 ms |
42792 KB |
Output is correct |
11 |
Correct |
39 ms |
42872 KB |
Output is correct |
12 |
Correct |
39 ms |
42872 KB |
Output is correct |
13 |
Correct |
42 ms |
42804 KB |
Output is correct |
14 |
Correct |
39 ms |
42756 KB |
Output is correct |
15 |
Correct |
39 ms |
42740 KB |
Output is correct |
16 |
Correct |
269 ms |
53884 KB |
Output is correct |
17 |
Correct |
659 ms |
73968 KB |
Output is correct |
18 |
Correct |
77 ms |
45492 KB |
Output is correct |
19 |
Correct |
232 ms |
55624 KB |
Output is correct |
20 |
Correct |
665 ms |
73936 KB |
Output is correct |
21 |
Correct |
403 ms |
59900 KB |
Output is correct |
22 |
Correct |
297 ms |
59296 KB |
Output is correct |
23 |
Correct |
677 ms |
73796 KB |
Output is correct |
24 |
Correct |
670 ms |
73816 KB |
Output is correct |
25 |
Correct |
700 ms |
73900 KB |
Output is correct |
26 |
Correct |
245 ms |
55476 KB |
Output is correct |
27 |
Correct |
242 ms |
55512 KB |
Output is correct |
28 |
Correct |
229 ms |
55372 KB |
Output is correct |
29 |
Correct |
235 ms |
55528 KB |
Output is correct |
30 |
Correct |
252 ms |
55584 KB |
Output is correct |
31 |
Correct |
39 ms |
42616 KB |
Output is correct |
32 |
Correct |
38 ms |
42596 KB |
Output is correct |
33 |
Correct |
38 ms |
42616 KB |
Output is correct |
34 |
Correct |
39 ms |
42616 KB |
Output is correct |
35 |
Correct |
37 ms |
42616 KB |
Output is correct |
36 |
Correct |
38 ms |
42620 KB |
Output is correct |
37 |
Correct |
38 ms |
42628 KB |
Output is correct |
38 |
Correct |
38 ms |
42572 KB |
Output is correct |
39 |
Correct |
39 ms |
42616 KB |
Output is correct |
40 |
Correct |
38 ms |
42616 KB |
Output is correct |
41 |
Correct |
336 ms |
59516 KB |
Output is correct |
42 |
Correct |
652 ms |
73412 KB |
Output is correct |
43 |
Correct |
624 ms |
73464 KB |
Output is correct |
44 |
Correct |
203 ms |
57128 KB |
Output is correct |
45 |
Correct |
623 ms |
73432 KB |
Output is correct |
46 |
Correct |
623 ms |
73560 KB |
Output is correct |
47 |
Correct |
617 ms |
73448 KB |
Output is correct |
48 |
Correct |
637 ms |
73448 KB |
Output is correct |
49 |
Correct |
609 ms |
73416 KB |
Output is correct |
50 |
Correct |
595 ms |
73324 KB |
Output is correct |
51 |
Correct |
614 ms |
73540 KB |
Output is correct |
52 |
Correct |
635 ms |
73504 KB |
Output is correct |
53 |
Correct |
614 ms |
73488 KB |
Output is correct |
54 |
Correct |
599 ms |
73516 KB |
Output is correct |
55 |
Correct |
621 ms |
73472 KB |
Output is correct |
56 |
Correct |
622 ms |
73336 KB |
Output is correct |
57 |
Correct |
599 ms |
73556 KB |
Output is correct |
58 |
Correct |
631 ms |
73424 KB |
Output is correct |
59 |
Correct |
204 ms |
58216 KB |
Output is correct |
60 |
Correct |
622 ms |
73392 KB |
Output is correct |
61 |
Correct |
596 ms |
73660 KB |
Output is correct |
62 |
Correct |
195 ms |
55108 KB |
Output is correct |
63 |
Correct |
208 ms |
55716 KB |
Output is correct |
64 |
Correct |
202 ms |
55220 KB |
Output is correct |
65 |
Correct |
191 ms |
55148 KB |
Output is correct |
66 |
Correct |
217 ms |
55648 KB |
Output is correct |
67 |
Correct |
212 ms |
58048 KB |
Output is correct |
68 |
Correct |
182 ms |
55288 KB |
Output is correct |
69 |
Correct |
207 ms |
57464 KB |
Output is correct |
70 |
Correct |
185 ms |
55108 KB |
Output is correct |
71 |
Correct |
207 ms |
57592 KB |
Output is correct |
72 |
Correct |
402 ms |
59948 KB |
Output is correct |
73 |
Correct |
677 ms |
73800 KB |
Output is correct |
74 |
Correct |
671 ms |
73920 KB |
Output is correct |
75 |
Correct |
666 ms |
73948 KB |
Output is correct |
76 |
Correct |
663 ms |
73924 KB |
Output is correct |
77 |
Correct |
675 ms |
73860 KB |
Output is correct |
78 |
Correct |
669 ms |
73804 KB |
Output is correct |
79 |
Correct |
677 ms |
73880 KB |
Output is correct |
80 |
Correct |
685 ms |
73792 KB |
Output is correct |
81 |
Correct |
701 ms |
73844 KB |
Output is correct |
82 |
Correct |
681 ms |
73884 KB |
Output is correct |
83 |
Correct |
670 ms |
73784 KB |
Output is correct |
84 |
Correct |
676 ms |
73860 KB |
Output is correct |
85 |
Correct |
670 ms |
73740 KB |
Output is correct |
86 |
Correct |
699 ms |
73788 KB |
Output is correct |
87 |
Correct |
712 ms |
73960 KB |
Output is correct |
88 |
Correct |
697 ms |
73900 KB |
Output is correct |
89 |
Correct |
394 ms |
58388 KB |
Output is correct |
90 |
Correct |
703 ms |
73804 KB |
Output is correct |
91 |
Correct |
638 ms |
73944 KB |
Output is correct |
92 |
Correct |
236 ms |
55496 KB |
Output is correct |
93 |
Correct |
307 ms |
56392 KB |
Output is correct |
94 |
Correct |
238 ms |
55484 KB |
Output is correct |
95 |
Correct |
234 ms |
55468 KB |
Output is correct |
96 |
Correct |
316 ms |
56196 KB |
Output is correct |
97 |
Correct |
369 ms |
57692 KB |
Output is correct |
98 |
Correct |
244 ms |
55380 KB |
Output is correct |
99 |
Correct |
380 ms |
58544 KB |
Output is correct |
100 |
Correct |
230 ms |
55488 KB |
Output is correct |