10-60分求助,r-l交上去只有10分,再减一能得60,再减一能得30
查看原帖
10-60分求助,r-l交上去只有10分,再减一能得60,再减一能得30
574890
zfy2006楼主2022/4/19 16:28
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,head[N],tot,dep[N],len,s,t,dis[N],fa[N],ma,l,r,ans;
bool vis[N];
struct o{
	int ne,to,dis;
}e[N<<1];
inline void add(int x,int y,int k){
	e[++tot].ne=head[x];
	head[x]=tot;
	e[tot].to=y;
	e[tot].dis=k;
}
inline void dfs(int x,int f){
	fa[x]=f;
	if(dep[x]>ma){
		ma=dep[x];
		s=x;
	}
	for(int i=head[x];i;i=e[i].ne){
		int to=e[i].to;
		if(to==f)continue;
		dep[to]=dep[x]+e[i].dis;
		dfs(to,x);
	}
	return;
}
inline void dfs2(int x,int fa){
	for(int i=head[x];i;i=e[i].ne){
		int to=e[i].to;
		if(to==fa||vis[to])continue;
		if(!dis[to])dfs(to,x);
		dis[x]=max(dis[x],dis[to]+e[i].dis);
	}
	return;
}
signed main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int a,b,c;
		cin>>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
	}
	dfs(1,0);
	dep[s]=0;
	t=s,ma=0;
	dfs(s,0);
	int p=s;
	cout<<dep[s]<<endl;
	ans=dep[s];
	while(s){
		vis[s]=1;
		s=fa[s];
		r++;
	}
	l=1;
//	r++;
	int k=0;
	while(p){
		dfs2(p,0);
		k++;
		if(dis[p]==ans-dep[p])l=max(l,k);
		if(dis[p]==dep[p])r=min(r,k);
		p=fa[p];
	}
	cout<<r-l;
	return 0;
}
2022/4/19 16:28
加载中...