#include <bits/stdc++.h>
#define eb emplace_back
#define mp make_pair
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define svec(x) sort(x.begin(), x.end())
#define press(x) x.erase(unique(x.begin(), x.end()), x.end())
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
typedef pair<int, LL> pil;
typedef pair<LL, int> pli;
const LL llinf=2e18;
const int inf=1e9;
int n, m, r1, r2;
vector<int> link[500010];
vector<pair<pii, int> > edg;
int dis[500010], sp[500010][30], ans;
void dfs(int num, int par){
dis[num]=dis[par]+1;
sp[num][0]=par;
for(auto i:link[num]){
if(i==par)continue;
dfs(i, num);
}
}
int lca(int x, int y){
if(dis[x]>dis[y])swap(x, y);
for(int i=20; i>=0; i--){
if(dis[y]-dis[x]>=(1<<i))y=sp[y][i];
}
if(x==y)return x;
for(int i=20; i>=0; i--){
if(sp[x][i]!=sp[y][i]){
x=sp[x][i];
y=sp[y][i];
}
}
return sp[x][0];
}
int get_dist(int x, int y){return dis[x]+dis[y]-2*dis[lca(x, y)];}
int dis2[500010], p[500010];
void dfs2(int num, int par){
dis2[num]=dis2[par]+1;
p[num]=par;
for(auto i:link[num]){
if(i==par)continue;
dfs2(i, num);
}
}
vector<int> rt1, rt2;
int h[500010];
bool ch[500010];
void dfs3(int num, int par){
for(auto i:link[num]){
if(i==par||ch[i])continue;
dfs3(i, num);
h[num]=max(h[num], h[i]+1);
}
if(ch[num])rt1.eb(h[num]);
for(auto i:link[num]){
if(i==par||!ch[i])continue;
dfs3(i, num);
}
}
struct SEGMENT_TREE{
int tree[2000010];
int f(int a, int b){return max(a, b);}
void update(int point, int s, int e, int num, int val){
if(s==e){
tree[point]=val;
return;
}
if(num<=(s+e)/2)update(point*2, s, (s+e)/2, num, val);
else update(point*2+1, (s+e)/2+1, e, num, val);
tree[point]=f(tree[point*2], tree[point*2+1]);
}
int query(int point, int s, int e, int a, int b){
if(a<=s&&e<=b)return tree[point];
if(e<a||s>b)return -inf;
return f(query(point*2, s, (s+e)/2, a, b), query(point*2+1, (s+e)/2+1, e, a, b));
}
}seg;
int main(){
scanf("%d %d", &n, &m);
for(int i=1; i<=m; i++){
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
a++; b++;
if(c==1){
link[a].eb(b);
link[b].eb(a);
}
else edg.eb(mp(a, b), c);
}
dfs(1, 0);
for(int j=1; j<=20; j++){
for(int i=1; i<=n; i++)sp[i][j]=sp[sp[i][j-1]][j-1];
}
dfs2(1, 0);
int r1=max_element(dis2+1, dis2+n+1)-dis2;
dfs2(r1, 0);
int r2=max_element(dis2+1, dis2+n+1)-dis2;
int tmp=r2;
while(tmp){
ch[tmp]=true;
tmp=p[tmp];
}
dfs3(r1, 0);
rt2=rt1;
for(int i=0; i<dis2[r2]; i++){
rt1[i]+=i, rt2[i]+=dis2[r2]-1-i;
}
for(int i=1; i<dis2[r2]; i++)rt1[i]=max(rt1[i], rt1[i-1]);
for(int i=dis2[r2]-2; i>=0; i--)rt2[i]=max(rt2[i], rt2[i+1]);
for(int i=0; i<dis2[r2]-1; i++)seg.update(1, 0, dis2[r2]-1, i, rt1[i]+rt2[i+1]);
ans=2*(n-1)-dis2[r2]+1;
for(auto i:edg){
int d=get_dist(i.F.F, i.F.S);
if(d<=i.S)continue;
int nd=2*(n-2)+i.S;
int r1to1=get_dist(r1, i.F.F)+dis2[r2]-1-get_dist(r2, i.F.F);
int r1to2=get_dist(r1, i.F.S)+dis2[r2]-1-get_dist(r2, i.F.S);
r1to1/=2, r1to2/=2;
if(r1to1>r1to2){
swap(i.F.F, i.F.S);
swap(r1to1, r1to2);
}
int d1=get_dist(r1, i.F.F);
int d2=get_dist(r2, i.F.S);
int h1=d1+get_dist(r2, i.F.F)-dis2[r2]+1;
int h2=d2+get_dist(r1, i.F.S)-dis2[r2]+1;
int mk1=d1-h1;
int mk2=dis2[r2]-1-d2+h2;
int tmp=seg.query(1, 0, dis2[r2]-1, mk1, mk2)-mk1-dis2[r2]-1+mk2;
ans=min(ans, nd-tmp+h1+h2);
}
printf("%d", ans);
}
Compilation message
Main.cpp: In function 'int main()':
Main.cpp:95:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
95 | scanf("%d %d", &n, &m);
| ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:98:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
98 | scanf("%d %d %d", &a, &b, &c);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
10 ms |
12160 KB |
Output is correct |
2 |
Correct |
8 ms |
12192 KB |
Output is correct |
3 |
Correct |
9 ms |
12160 KB |
Output is correct |
4 |
Correct |
9 ms |
12192 KB |
Output is correct |
5 |
Correct |
9 ms |
12160 KB |
Output is correct |
6 |
Correct |
8 ms |
12160 KB |
Output is correct |
7 |
Correct |
8 ms |
12160 KB |
Output is correct |
8 |
Correct |
8 ms |
12160 KB |
Output is correct |
9 |
Correct |
11 ms |
12160 KB |
Output is correct |
10 |
Correct |
9 ms |
12160 KB |
Output is correct |
11 |
Incorrect |
10 ms |
12160 KB |
Output isn't correct |
12 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
10 ms |
12160 KB |
Output is correct |
2 |
Correct |
8 ms |
12192 KB |
Output is correct |
3 |
Correct |
9 ms |
12160 KB |
Output is correct |
4 |
Correct |
9 ms |
12192 KB |
Output is correct |
5 |
Correct |
9 ms |
12160 KB |
Output is correct |
6 |
Correct |
8 ms |
12160 KB |
Output is correct |
7 |
Correct |
8 ms |
12160 KB |
Output is correct |
8 |
Correct |
8 ms |
12160 KB |
Output is correct |
9 |
Correct |
11 ms |
12160 KB |
Output is correct |
10 |
Correct |
9 ms |
12160 KB |
Output is correct |
11 |
Incorrect |
10 ms |
12160 KB |
Output isn't correct |
12 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
21 ms |
13440 KB |
Output is correct |
2 |
Correct |
23 ms |
13440 KB |
Output is correct |
3 |
Correct |
20 ms |
13312 KB |
Output is correct |
4 |
Correct |
15 ms |
13312 KB |
Output is correct |
5 |
Correct |
16 ms |
13184 KB |
Output is correct |
6 |
Correct |
15 ms |
13056 KB |
Output is correct |
7 |
Correct |
20 ms |
13568 KB |
Output is correct |
8 |
Correct |
20 ms |
13312 KB |
Output is correct |
9 |
Correct |
21 ms |
13532 KB |
Output is correct |
10 |
Correct |
15 ms |
13312 KB |
Output is correct |
11 |
Correct |
16 ms |
13312 KB |
Output is correct |
12 |
Correct |
17 ms |
13312 KB |
Output is correct |
13 |
Correct |
16 ms |
13312 KB |
Output is correct |
14 |
Correct |
16 ms |
13312 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
10 ms |
12160 KB |
Output is correct |
2 |
Correct |
8 ms |
12192 KB |
Output is correct |
3 |
Correct |
9 ms |
12160 KB |
Output is correct |
4 |
Correct |
9 ms |
12192 KB |
Output is correct |
5 |
Correct |
9 ms |
12160 KB |
Output is correct |
6 |
Correct |
8 ms |
12160 KB |
Output is correct |
7 |
Correct |
8 ms |
12160 KB |
Output is correct |
8 |
Correct |
8 ms |
12160 KB |
Output is correct |
9 |
Correct |
11 ms |
12160 KB |
Output is correct |
10 |
Correct |
9 ms |
12160 KB |
Output is correct |
11 |
Incorrect |
10 ms |
12160 KB |
Output isn't correct |
12 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
10 ms |
12160 KB |
Output is correct |
2 |
Correct |
8 ms |
12192 KB |
Output is correct |
3 |
Correct |
9 ms |
12160 KB |
Output is correct |
4 |
Correct |
9 ms |
12192 KB |
Output is correct |
5 |
Correct |
9 ms |
12160 KB |
Output is correct |
6 |
Correct |
8 ms |
12160 KB |
Output is correct |
7 |
Correct |
8 ms |
12160 KB |
Output is correct |
8 |
Correct |
8 ms |
12160 KB |
Output is correct |
9 |
Correct |
11 ms |
12160 KB |
Output is correct |
10 |
Correct |
9 ms |
12160 KB |
Output is correct |
11 |
Incorrect |
10 ms |
12160 KB |
Output isn't correct |
12 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
10 ms |
12160 KB |
Output is correct |
2 |
Correct |
8 ms |
12192 KB |
Output is correct |
3 |
Correct |
9 ms |
12160 KB |
Output is correct |
4 |
Correct |
9 ms |
12192 KB |
Output is correct |
5 |
Correct |
9 ms |
12160 KB |
Output is correct |
6 |
Correct |
8 ms |
12160 KB |
Output is correct |
7 |
Correct |
8 ms |
12160 KB |
Output is correct |
8 |
Correct |
8 ms |
12160 KB |
Output is correct |
9 |
Correct |
11 ms |
12160 KB |
Output is correct |
10 |
Correct |
9 ms |
12160 KB |
Output is correct |
11 |
Incorrect |
10 ms |
12160 KB |
Output isn't correct |
12 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
10 ms |
12160 KB |
Output is correct |
2 |
Correct |
8 ms |
12192 KB |
Output is correct |
3 |
Correct |
9 ms |
12160 KB |
Output is correct |
4 |
Correct |
9 ms |
12192 KB |
Output is correct |
5 |
Correct |
9 ms |
12160 KB |
Output is correct |
6 |
Correct |
8 ms |
12160 KB |
Output is correct |
7 |
Correct |
8 ms |
12160 KB |
Output is correct |
8 |
Correct |
8 ms |
12160 KB |
Output is correct |
9 |
Correct |
11 ms |
12160 KB |
Output is correct |
10 |
Correct |
9 ms |
12160 KB |
Output is correct |
11 |
Incorrect |
10 ms |
12160 KB |
Output isn't correct |
12 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
10 ms |
12160 KB |
Output is correct |
2 |
Correct |
8 ms |
12192 KB |
Output is correct |
3 |
Correct |
9 ms |
12160 KB |
Output is correct |
4 |
Correct |
9 ms |
12192 KB |
Output is correct |
5 |
Correct |
9 ms |
12160 KB |
Output is correct |
6 |
Correct |
8 ms |
12160 KB |
Output is correct |
7 |
Correct |
8 ms |
12160 KB |
Output is correct |
8 |
Correct |
8 ms |
12160 KB |
Output is correct |
9 |
Correct |
11 ms |
12160 KB |
Output is correct |
10 |
Correct |
9 ms |
12160 KB |
Output is correct |
11 |
Incorrect |
10 ms |
12160 KB |
Output isn't correct |
12 |
Halted |
0 ms |
0 KB |
- |