80pts wa on #3#4求调
查看原帖
80pts wa on #3#4求调
722018
User722018楼主2024/8/13 17:25
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <map>
#include <stack>
#include <vector>
#include <algorithm>
//#include <time.h>
#define ll long long
#define sort stable_sort
using namespace std;
ll n;
ll first[2000010];
int f[2000010];
ll dep[2000010];
int tot=0;
struct node
{
	ll u,v,w,to;
}q[4000010];
ll ls[2000010],rs[2000010],vis[2000010];
void add_edge(ll u,ll v,ll w)
{
	tot++;
	q[tot].u=u;
	q[tot].v=v;
	q[tot].w=w;
	q[tot].to=first[u];
	first[u]=tot;
}
ll tem=0,st;
void ddfs(int x,int fa)
{
	f[x]=fa;
	if(dep[x]>tem)
	{
		st=x;
		tem=dep[x];
	}
	ll k=first[x];
	while(k)
	{
		if(q[k].v!=fa && !vis[q[k].v])
		{
			dep[q[k].v]=dep[x]+q[k].w;
			ddfs(q[k].v,x);
		}
		k=q[k].to;
	}
}
ll kl[100010],kr[100010];
void zj_dfs(int x,int fa,int sbm)
{
	int k=first[x];
	while(k)
	{
		if(q[k].v!=fa && vis[q[k].v])
		{
			if(sbm==1)
			{
				ls[q[k].v]=ls[q[k].u]+q[k].w;
				kl[q[k].v]=kl[q[k].u]+1;
			}
			else
			{
				rs[q[k].v]=rs[q[k].u]+q[k].w;
				kr[q[k].v]=kr[q[k].u]+1;
			}
			zj_dfs(q[k].v,x,sbm);
		}
		k=q[k].to;
	}
}
int cnt=0;
int t[100010];
int main()
{
	cin>>n;
	for(int i=1;i<n;i++)
	{
		ll u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		add_edge(u,v,w);
		add_edge(v,u,w);
	}
	ddfs(1,0);
	dep[st]=0;
	tem=0;
	memset(f,0,sizeof f);
	ll all=st;
	ddfs(st,0);
	ll arr=st;
	cout<<tem<<endl;
	tem=0;
	
	ll k=arr;
	while(k)
	{
		vis[k]=1;
		t[++cnt]=k;
		k=f[k];
	}
	zj_dfs(all,0,1);
	zj_dfs(arr,0,2);
	ll al=all,ar=arr;
	for(int i=1;i<=cnt;i++)
	{
		ll x=t[i];
		dep[x]=0;
		tem=0;
		st=0;
		ddfs(x,0);
		if(tem==ls[x] && dep[st]>0 && st!=x)
		{
			al=x;
		}
		if(tem==rs[x] && dep[st]>0 && st!=x)
		{
			ar=x;
		}
	}
	cout<<abs(kl[ar]-kl[al])<<endl;
	return 0;
}
2024/8/13 17:25
加载中...