求助
  • 板块灌水区
  • 楼主_Flu_
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/2/1 16:46
  • 上次更新2023/10/24 02:12:20
查看原帖
求助
254385
_Flu_楼主2023/2/1 16:46

下面这一段代码,有两行注释。如果把它们取消注释,输入最下面的那几行数字后得到的输出与直接调用下面的代码输出不一样,求原因。

#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
*/
2023/2/1 16:46
加载中...