#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;
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];
void dfs2(int num, int par){
dis2[num]=dis2[par]+1;
for(auto i:link[num]){
if(i==par)continue;
dfs2(i, num);
}
}
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;
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);
if(r1to1>r1to2)swap(i.F.F, i.F.S);
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;
int mk2=d-d2;
if(mk1>=mk2||mk1>=d-h2||mk2<=h1)ans=min(ans, nd-d1-d2);
else ans=min(ans, nd-d1-d2-mk2-mk1+1);
}
printf("%d", ans);
}
Compilation message
Main.cpp: In function 'int main()':
Main.cpp:58:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
58 | scanf("%d %d", &n, &m);
| ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:61:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
61 | scanf("%d %d %d", &a, &b, &c);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
12032 KB |
Output is correct |
2 |
Correct |
10 ms |
12032 KB |
Output is correct |
3 |
Incorrect |
9 ms |
12032 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
12032 KB |
Output is correct |
2 |
Correct |
10 ms |
12032 KB |
Output is correct |
3 |
Incorrect |
9 ms |
12032 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
13184 KB |
Output is correct |
2 |
Correct |
18 ms |
13312 KB |
Output is correct |
3 |
Correct |
20 ms |
13184 KB |
Output is correct |
4 |
Correct |
15 ms |
13184 KB |
Output is correct |
5 |
Correct |
18 ms |
13184 KB |
Output is correct |
6 |
Correct |
14 ms |
13172 KB |
Output is correct |
7 |
Correct |
19 ms |
13312 KB |
Output is correct |
8 |
Correct |
23 ms |
13184 KB |
Output is correct |
9 |
Correct |
19 ms |
13312 KB |
Output is correct |
10 |
Correct |
15 ms |
13184 KB |
Output is correct |
11 |
Correct |
16 ms |
13184 KB |
Output is correct |
12 |
Correct |
15 ms |
13184 KB |
Output is correct |
13 |
Correct |
20 ms |
13184 KB |
Output is correct |
14 |
Correct |
16 ms |
13184 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
12032 KB |
Output is correct |
2 |
Correct |
10 ms |
12032 KB |
Output is correct |
3 |
Incorrect |
9 ms |
12032 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
12032 KB |
Output is correct |
2 |
Correct |
10 ms |
12032 KB |
Output is correct |
3 |
Incorrect |
9 ms |
12032 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
12032 KB |
Output is correct |
2 |
Correct |
10 ms |
12032 KB |
Output is correct |
3 |
Incorrect |
9 ms |
12032 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
12032 KB |
Output is correct |
2 |
Correct |
10 ms |
12032 KB |
Output is correct |
3 |
Incorrect |
9 ms |
12032 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
12032 KB |
Output is correct |
2 |
Correct |
10 ms |
12032 KB |
Output is correct |
3 |
Incorrect |
9 ms |
12032 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |