//Solution by Tima
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <cstring>
#include <map>
#include <cstdlib>
#include <ctime>
#include <cassert>
#include <bitset>
#define f first
#define s second
#define ll long long
#define ull unsigned long long
#define mp make_pair
#define pb push_back
#define vi vector <int>
#define ld long double
#define pii pair<int, int>
#define y1 sda
using namespace std;
const int N = int(5e5) + 10, mod = int(1e9) + 7;
int n,m,q,k, a[N], p[N], rnk[N], up[N][18], mx[N][18], tin[N], tout[N], timer;
vector <pair<int,int> > g[N];
vector <pair<int,pair<int,int> > > all;
priority_queue <pair<int,int> > pq;
bool was[N], used[N];
int get(int v){
if(p[v] == v) return v;
return p[v] = get(p[v]);
}
bool Merge(int a,int b){
a = get(a);
b = get(b);
if(a == b) return 0;
if(rnk[a] > rnk[b]) swap(a,b);
rnk[b] += rnk[a];
p[a] = b;
return 1;
}
void dfs(int v){
used[v] = 1;
tin[v] = ++timer;
for(auto p : g[v]){
if(!used[p.f]){
up[p.f][0] = v;
mx[p.f][0] = p.s;
dfs(p.f);
}
}
tout[v] = ++timer;
}
bool ok(int u,int v){
return (tin[u] <= tin[v] && tout[u] >= tout[v]);
}
int lca(int u,int v){
if(ok(u,v)) return u;
if(ok(v,u)) return v;
for(int i = 17; i >= 0; i--){
if(up[v][i] != -1 && !ok(up[v][i], u)) v = up[v][i];
}
return up[v][0];
}
int getx(int v,int u){
if(v == u) return mod;
int res = mod;
for(int i = 17; i >= 0; i--){
if(up[v][i] != -1 && !ok(up[v][i], u)){
res = min(res, mx[v][i]);
v = up[v][i];
}
}
return min(res, mx[v][0]);
}
int get_min(int u,int v){
int x = lca(u,v);
return min(getx(u,x), getx(v,x));
}
int main () {
scanf("%d%d", &n, &m);
for(int i = 1,x,y,z; i <= m; i++){
scanf("%d%d%d", &x, &y, &z);
g[x].pb(mp(y,z));
g[y].pb(mp(x,z));
all.pb(mp(z, mp(x,y)));
}
scanf("%d", &k);
for(int i = 1; i <= n; i++){
a[i] = mod;
}
for(int i = 1,x; i <= k; i++){
scanf("%d", &x);
a[x] = 0;
pq.push(mp(0, x));
}
while(!pq.empty()){
int v = (pq.top()).s;
pq.pop();
if(was[v]) continue;
was[v] = 1;
for(auto p : g[v]){
if(a[p.f] > a[v] + p.s){
a[p.f] = a[v] + p.s;
pq.push(mp(-a[p.f], p.f));
}
}
}
for(int i = 0; i < all.size(); i++) {
all[i].f = min(a[all[i].s.f], a[all[i].s.s]);
}
sort(all.begin(), all.end());
for(int i = 1; i <= n; i++){
g[i].clear();
p[i] = i;
rnk[i] = 1;
}
reverse(all.begin(), all.end());
for(int i = 0,x,y,z; i < all.size(); i++){
x = all[i].s.f;
y = all[i].s.s;
z = all[i].f;
if(Merge(x,y)){
g[x].pb(mp(y,z));
g[y].pb(mp(x,z));
}
}
memset(up, -1, sizeof(up));
for(int j = 0; j <= 17; j++){
for(int i = 1; i <= n; i++){
mx[i][j] = mod;
}
}
dfs(1);
for(int j = 1; j <= 17; j++){
for(int i = 1; i <= n; i++) if(up[i][j - 1] != -1){
up[i][j] = up[up[i][j - 1]][j - 1];
mx[i][j] = min(mx[i][j - 1], mx[up[i][j - 1]][j - 1]);
}
}
scanf("%d", &q);
int x,y;
ll ans = 0,res = 0;
while(q--){
scanf("%d%d", &x, &y);
printf("%d\n", get_min(x,y));
}
return 0;
}
Compilation message
plan.cpp: In function 'int main()':
plan.cpp:133:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < all.size(); i++) {
~~^~~~~~~~~~~~
plan.cpp:147:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0,x,y,z; i < all.size(); i++){
~~^~~~~~~~~~~~
plan.cpp:175:5: warning: unused variable 'ans' [-Wunused-variable]
ll ans = 0,res = 0;
^~~
plan.cpp:175:13: warning: unused variable 'res' [-Wunused-variable]
ll ans = 0,res = 0;
^~~
plan.cpp:99:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &n, &m);
~~~~~^~~~~~~~~~~~~~~~
plan.cpp:102:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d%d", &x, &y, &z);
~~~~~^~~~~~~~~~~~~~~~~~~~~~
plan.cpp:108:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &k);
~~~~~^~~~~~~~~~
plan.cpp:115:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &x);
~~~~~^~~~~~~~~~
plan.cpp:173:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &q);
~~~~~^~~~~~~~~~
plan.cpp:177:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &x, &y);
~~~~~^~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
43 ms |
47272 KB |
Output is correct |
2 |
Correct |
44 ms |
47420 KB |
Output is correct |
3 |
Correct |
44 ms |
47456 KB |
Output is correct |
4 |
Correct |
43 ms |
47288 KB |
Output is correct |
5 |
Correct |
44 ms |
47448 KB |
Output is correct |
6 |
Correct |
45 ms |
47552 KB |
Output is correct |
7 |
Correct |
43 ms |
47372 KB |
Output is correct |
8 |
Correct |
43 ms |
47352 KB |
Output is correct |
9 |
Correct |
44 ms |
47480 KB |
Output is correct |
10 |
Correct |
44 ms |
47480 KB |
Output is correct |
11 |
Correct |
44 ms |
47452 KB |
Output is correct |
12 |
Correct |
43 ms |
47484 KB |
Output is correct |
13 |
Correct |
44 ms |
47452 KB |
Output is correct |
14 |
Correct |
44 ms |
47608 KB |
Output is correct |
15 |
Correct |
44 ms |
47480 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
43 ms |
47272 KB |
Output is correct |
2 |
Correct |
44 ms |
47420 KB |
Output is correct |
3 |
Correct |
44 ms |
47456 KB |
Output is correct |
4 |
Correct |
43 ms |
47288 KB |
Output is correct |
5 |
Correct |
44 ms |
47448 KB |
Output is correct |
6 |
Correct |
45 ms |
47552 KB |
Output is correct |
7 |
Correct |
43 ms |
47372 KB |
Output is correct |
8 |
Correct |
43 ms |
47352 KB |
Output is correct |
9 |
Correct |
44 ms |
47480 KB |
Output is correct |
10 |
Correct |
44 ms |
47480 KB |
Output is correct |
11 |
Correct |
44 ms |
47452 KB |
Output is correct |
12 |
Correct |
43 ms |
47484 KB |
Output is correct |
13 |
Correct |
44 ms |
47452 KB |
Output is correct |
14 |
Correct |
44 ms |
47608 KB |
Output is correct |
15 |
Correct |
44 ms |
47480 KB |
Output is correct |
16 |
Correct |
271 ms |
61124 KB |
Output is correct |
17 |
Correct |
771 ms |
81616 KB |
Output is correct |
18 |
Correct |
89 ms |
50952 KB |
Output is correct |
19 |
Correct |
254 ms |
65332 KB |
Output is correct |
20 |
Correct |
729 ms |
80748 KB |
Output is correct |
21 |
Correct |
419 ms |
68996 KB |
Output is correct |
22 |
Correct |
268 ms |
67840 KB |
Output is correct |
23 |
Correct |
734 ms |
81420 KB |
Output is correct |
24 |
Correct |
744 ms |
81788 KB |
Output is correct |
25 |
Correct |
821 ms |
81768 KB |
Output is correct |
26 |
Correct |
239 ms |
65328 KB |
Output is correct |
27 |
Correct |
248 ms |
65368 KB |
Output is correct |
28 |
Correct |
240 ms |
65408 KB |
Output is correct |
29 |
Correct |
246 ms |
65248 KB |
Output is correct |
30 |
Correct |
249 ms |
64968 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
43 ms |
47376 KB |
Output is correct |
2 |
Correct |
43 ms |
47396 KB |
Output is correct |
3 |
Correct |
43 ms |
47356 KB |
Output is correct |
4 |
Correct |
43 ms |
47352 KB |
Output is correct |
5 |
Correct |
42 ms |
47352 KB |
Output is correct |
6 |
Correct |
44 ms |
47352 KB |
Output is correct |
7 |
Correct |
43 ms |
47352 KB |
Output is correct |
8 |
Correct |
42 ms |
47352 KB |
Output is correct |
9 |
Correct |
43 ms |
47352 KB |
Output is correct |
10 |
Correct |
43 ms |
47316 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
340 ms |
68408 KB |
Output is correct |
2 |
Correct |
645 ms |
81052 KB |
Output is correct |
3 |
Correct |
660 ms |
81284 KB |
Output is correct |
4 |
Correct |
198 ms |
65068 KB |
Output is correct |
5 |
Correct |
705 ms |
81252 KB |
Output is correct |
6 |
Correct |
653 ms |
81836 KB |
Output is correct |
7 |
Correct |
646 ms |
81984 KB |
Output is correct |
8 |
Correct |
649 ms |
82048 KB |
Output is correct |
9 |
Correct |
683 ms |
81632 KB |
Output is correct |
10 |
Correct |
673 ms |
81508 KB |
Output is correct |
11 |
Correct |
674 ms |
81012 KB |
Output is correct |
12 |
Correct |
674 ms |
81284 KB |
Output is correct |
13 |
Correct |
674 ms |
81332 KB |
Output is correct |
14 |
Correct |
689 ms |
81760 KB |
Output is correct |
15 |
Correct |
675 ms |
82496 KB |
Output is correct |
16 |
Correct |
727 ms |
80680 KB |
Output is correct |
17 |
Correct |
659 ms |
81488 KB |
Output is correct |
18 |
Correct |
667 ms |
81860 KB |
Output is correct |
19 |
Correct |
188 ms |
66732 KB |
Output is correct |
20 |
Correct |
668 ms |
81500 KB |
Output is correct |
21 |
Correct |
663 ms |
80396 KB |
Output is correct |
22 |
Correct |
189 ms |
64668 KB |
Output is correct |
23 |
Correct |
205 ms |
63404 KB |
Output is correct |
24 |
Correct |
190 ms |
65052 KB |
Output is correct |
25 |
Correct |
186 ms |
65224 KB |
Output is correct |
26 |
Correct |
204 ms |
64072 KB |
Output is correct |
27 |
Correct |
227 ms |
66740 KB |
Output is correct |
28 |
Correct |
185 ms |
65052 KB |
Output is correct |
29 |
Correct |
202 ms |
66064 KB |
Output is correct |
30 |
Correct |
184 ms |
65044 KB |
Output is correct |
31 |
Correct |
205 ms |
66072 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
43 ms |
47272 KB |
Output is correct |
2 |
Correct |
44 ms |
47420 KB |
Output is correct |
3 |
Correct |
44 ms |
47456 KB |
Output is correct |
4 |
Correct |
43 ms |
47288 KB |
Output is correct |
5 |
Correct |
44 ms |
47448 KB |
Output is correct |
6 |
Correct |
45 ms |
47552 KB |
Output is correct |
7 |
Correct |
43 ms |
47372 KB |
Output is correct |
8 |
Correct |
43 ms |
47352 KB |
Output is correct |
9 |
Correct |
44 ms |
47480 KB |
Output is correct |
10 |
Correct |
44 ms |
47480 KB |
Output is correct |
11 |
Correct |
44 ms |
47452 KB |
Output is correct |
12 |
Correct |
43 ms |
47484 KB |
Output is correct |
13 |
Correct |
44 ms |
47452 KB |
Output is correct |
14 |
Correct |
44 ms |
47608 KB |
Output is correct |
15 |
Correct |
44 ms |
47480 KB |
Output is correct |
16 |
Correct |
271 ms |
61124 KB |
Output is correct |
17 |
Correct |
771 ms |
81616 KB |
Output is correct |
18 |
Correct |
89 ms |
50952 KB |
Output is correct |
19 |
Correct |
254 ms |
65332 KB |
Output is correct |
20 |
Correct |
729 ms |
80748 KB |
Output is correct |
21 |
Correct |
419 ms |
68996 KB |
Output is correct |
22 |
Correct |
268 ms |
67840 KB |
Output is correct |
23 |
Correct |
734 ms |
81420 KB |
Output is correct |
24 |
Correct |
744 ms |
81788 KB |
Output is correct |
25 |
Correct |
821 ms |
81768 KB |
Output is correct |
26 |
Correct |
239 ms |
65328 KB |
Output is correct |
27 |
Correct |
248 ms |
65368 KB |
Output is correct |
28 |
Correct |
240 ms |
65408 KB |
Output is correct |
29 |
Correct |
246 ms |
65248 KB |
Output is correct |
30 |
Correct |
249 ms |
64968 KB |
Output is correct |
31 |
Correct |
43 ms |
47376 KB |
Output is correct |
32 |
Correct |
43 ms |
47396 KB |
Output is correct |
33 |
Correct |
43 ms |
47356 KB |
Output is correct |
34 |
Correct |
43 ms |
47352 KB |
Output is correct |
35 |
Correct |
42 ms |
47352 KB |
Output is correct |
36 |
Correct |
44 ms |
47352 KB |
Output is correct |
37 |
Correct |
43 ms |
47352 KB |
Output is correct |
38 |
Correct |
42 ms |
47352 KB |
Output is correct |
39 |
Correct |
43 ms |
47352 KB |
Output is correct |
40 |
Correct |
43 ms |
47316 KB |
Output is correct |
41 |
Correct |
340 ms |
68408 KB |
Output is correct |
42 |
Correct |
645 ms |
81052 KB |
Output is correct |
43 |
Correct |
660 ms |
81284 KB |
Output is correct |
44 |
Correct |
198 ms |
65068 KB |
Output is correct |
45 |
Correct |
705 ms |
81252 KB |
Output is correct |
46 |
Correct |
653 ms |
81836 KB |
Output is correct |
47 |
Correct |
646 ms |
81984 KB |
Output is correct |
48 |
Correct |
649 ms |
82048 KB |
Output is correct |
49 |
Correct |
683 ms |
81632 KB |
Output is correct |
50 |
Correct |
673 ms |
81508 KB |
Output is correct |
51 |
Correct |
674 ms |
81012 KB |
Output is correct |
52 |
Correct |
674 ms |
81284 KB |
Output is correct |
53 |
Correct |
674 ms |
81332 KB |
Output is correct |
54 |
Correct |
689 ms |
81760 KB |
Output is correct |
55 |
Correct |
675 ms |
82496 KB |
Output is correct |
56 |
Correct |
727 ms |
80680 KB |
Output is correct |
57 |
Correct |
659 ms |
81488 KB |
Output is correct |
58 |
Correct |
667 ms |
81860 KB |
Output is correct |
59 |
Correct |
188 ms |
66732 KB |
Output is correct |
60 |
Correct |
668 ms |
81500 KB |
Output is correct |
61 |
Correct |
663 ms |
80396 KB |
Output is correct |
62 |
Correct |
189 ms |
64668 KB |
Output is correct |
63 |
Correct |
205 ms |
63404 KB |
Output is correct |
64 |
Correct |
190 ms |
65052 KB |
Output is correct |
65 |
Correct |
186 ms |
65224 KB |
Output is correct |
66 |
Correct |
204 ms |
64072 KB |
Output is correct |
67 |
Correct |
227 ms |
66740 KB |
Output is correct |
68 |
Correct |
185 ms |
65052 KB |
Output is correct |
69 |
Correct |
202 ms |
66064 KB |
Output is correct |
70 |
Correct |
184 ms |
65044 KB |
Output is correct |
71 |
Correct |
205 ms |
66072 KB |
Output is correct |
72 |
Correct |
431 ms |
69512 KB |
Output is correct |
73 |
Correct |
777 ms |
83616 KB |
Output is correct |
74 |
Correct |
794 ms |
83076 KB |
Output is correct |
75 |
Correct |
912 ms |
81868 KB |
Output is correct |
76 |
Correct |
835 ms |
81664 KB |
Output is correct |
77 |
Correct |
757 ms |
81924 KB |
Output is correct |
78 |
Correct |
762 ms |
81896 KB |
Output is correct |
79 |
Correct |
852 ms |
81844 KB |
Output is correct |
80 |
Correct |
779 ms |
81012 KB |
Output is correct |
81 |
Correct |
780 ms |
81180 KB |
Output is correct |
82 |
Correct |
772 ms |
80660 KB |
Output is correct |
83 |
Correct |
786 ms |
80552 KB |
Output is correct |
84 |
Correct |
761 ms |
80596 KB |
Output is correct |
85 |
Correct |
771 ms |
81896 KB |
Output is correct |
86 |
Correct |
756 ms |
80936 KB |
Output is correct |
87 |
Correct |
772 ms |
80844 KB |
Output is correct |
88 |
Correct |
788 ms |
81344 KB |
Output is correct |
89 |
Correct |
348 ms |
66860 KB |
Output is correct |
90 |
Correct |
761 ms |
80864 KB |
Output is correct |
91 |
Correct |
737 ms |
80900 KB |
Output is correct |
92 |
Correct |
290 ms |
65188 KB |
Output is correct |
93 |
Correct |
345 ms |
64200 KB |
Output is correct |
94 |
Correct |
265 ms |
64576 KB |
Output is correct |
95 |
Correct |
265 ms |
64908 KB |
Output is correct |
96 |
Correct |
327 ms |
63484 KB |
Output is correct |
97 |
Correct |
364 ms |
65656 KB |
Output is correct |
98 |
Correct |
261 ms |
64836 KB |
Output is correct |
99 |
Correct |
371 ms |
67204 KB |
Output is correct |
100 |
Correct |
259 ms |
65308 KB |
Output is correct |