下面这一段代码,有两行注释。如果把它们取消注释,输入最下面的那几行数字后得到的输出与直接调用下面的代码输出不一样,求原因。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
inline int read(){
int f = 0; char ch = getchar();
while(ch < '0' || ch > '9') ch = getchar();
while(ch >= '0' && ch <= '9'){
f = f * 10 + ch - '0';
ch = getchar();
}
return f;
}
int n;
int head[N], ver[N << 1], Next[N << 1], tot;
ll edge[N << 1];
bool e[N], vis[N];
int s;
int dota[N], cnt;
void add(int x, int y, int z){
ver[++tot] = y; Next[tot] = head[x]; head[x] = tot; edge[tot] = z;
}
bool flag;
ll tmp, dis[N];
void Find(int x, int f, ll le){
vis[x] = true;
for(int i = head[x]; i && !flag; i = Next[i]){
int y = ver[i];
if(y == f) continue;
if(vis[y]){
s = y; e[x] = true;
dota[++cnt] = x; tmp = edge[i];
dis[cnt + 1] = le;
flag = true; return;
}
Find(y, x, edge[i]);
}
vis[x] = false;
if(flag){
e[x] = true;
dota[++cnt] = x;
if(s != x) dis[cnt + 1] = dis[cnt] + le;
}
if(s == x) flag = false;
}
int d; ll len;
void dfs(int x, ll l){
vis[x] = true;
if(len < l) d = x, len = l;
for(int i = head[x]; i; i = Next[i]){
int y = ver[i];
if(vis[y]) continue;
dfs(y, l + edge[i]);
}
vis[x] = false;
}
ll half_pre[N], all_pre[N], half_sub[N], all_sub[N], f[N];
double solve(){
ll ans1 = 0, ans2 = 0;
for(int i = 1; i <= cnt; ++i){
int x = dota[i];
vis[x] = true;
int sel;
for(int j = head[x]; j; j = Next[j]){
int y = ver[j];
if(e[y]) continue;
len = 0;
dfs(y, edge[j]);
if(len > f[i]){
sel = f[i]; f[i] = len;
}
dfs(d, 0);
ans1 = max(ans1, len);
}
ans1 = max(ans1, sel + f[i]);
vis[x] = false;
}
ll maxn = 0;
for(int i = 1; i <= cnt; ++i){
// cerr << dota[i] << " to " << dota[1] << " : " << dis[i] << endl;
half_pre[i] = max(half_pre[i - 1], dis[i] + f[i]);
all_pre[i] = max(all_pre[i - 1], dis[i] + maxn + f[i]);
maxn = max(maxn, f[i] - dis[i]);
}
// cerr << dota[cnt] << " to " << dota[1] << " : " << tmp << endl;
maxn = 0;
for(int i = cnt; i >= 1; --i){
ll sub = dis[cnt] - dis[i];
half_sub[i] = max(half_sub[i + 1], sub + f[i]);
all_sub[i] = max(all_sub[i + 1], maxn + sub + f[i]);
maxn = max(maxn, f[i] - sub);
}
ans2 = LLONG_MAX;
for(int i = 1; i <= cnt; ++i) ans2 = min(ans2, max(all_pre[i], max(all_sub[i], half_pre[i] + half_sub[i+1] + tmp)));
return (double)max(ans1, ans2) / 2.0;
}
int main(){
cin >> n;
for(int i = 1, a, b, l; i <= n; ++i){
cin >> a >> b >> l;
add(a, b, l); add(b, a, l);
}
Find(1, 0, 0);
printf("%.1f", solve());
return 0;
}
/*
10
4 5 1
2 1 1
7 5 1
10 1 1
6 5 1
9 7 1
3 2 1
8 6 1
10 9 1
4 3 1
*/