为什么样例都不对但是能过啊!
查看原帖
为什么样例都不对但是能过啊!
1039274
Cypher_404楼主2024/3/23 14:13
//#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=400010;
struct edge
{
	int net,v,w,id;
}e[N];
struct getin
{
	int u,v,w,id;
}q[N];
int head[N],tot,dis[N],sum[N],n,ans,maxn;
void addedge(int u,int v,int w,int id)
{
	tot++;
	e[tot].v=v;
	e[tot].w=w;
	e[tot].id=id;
	e[tot].net=head[u];
	head[u]=tot;
}
bool getans(int now,int V,int fa)
{
	if(now==V)
		return 1;
	for(int i=head[now];i;i=e[i].net)
	{
		int to=e[i].v;
		if(to==fa)
			continue;
		if(getans(to,V,now))
		{
			sum[e[i].id]++;
			return 1;
		}
	}
	return 0;
}
struct node
{
	int u;
	int fa;
};
void find1(node x)
{
	queue<node>que;
	que.push(x);
	while(!que.empty())
	{
		node u=que.front();
		que.pop();
		if(dis[u.u]>ans)
		{
			ans=dis[u.u];
			maxn=u.u; 
		}
		for(int i=head[u.u];i;i=e[i].net)
		{
			if(u.fa==e[i].v)
			{
				continue;
			}
			dis[e[i].v]=dis[u.u]+e[i].w;
			que.push({e[i].v,u.u});
		}
	}
}
signed main()
{
	cin>>n;
	for(int i=1,x,y,z;i<n;i++)
	{
		scanf("%lld%lld%lld",&q[i].u,&q[i].v,&q[i].w);
		q[i].id=i;
		addedge(q[i].u,q[i].v,q[i].w,q[i].id);
		addedge(q[i].v,q[i].u,q[i].w,q[i].id);
	}
	find1({1,0});
	dis[maxn]=0;
	find1({maxn,0});
	cout<<ans<<'\n';
	int T=10;
	int rt1=1;
	int rt2=1;
	for(int i=1;i<=T;i++)
	{
		random_shuffle(q+1,q+n);
		memset(head,0,sizeof(head));
		tot=0;
		memset(dis,0,sizeof(dis));
		memset(e,0,sizeof(e));
		for(int i=1;i<n;i++)
		{
			addedge(q[i].u,q[i].v,q[i].w,q[i].id);
			addedge(q[i].v,q[i].u,q[i].w,q[i].id);
		}
		find1({1,0});
		ans=0;
		rt1=maxn;
		memset(dis,0,sizeof(dis));
		find1({rt1,0});
		rt2=maxn;
		getans(rt1,rt2,0);
	}
	int Ans=0;
	for(int i=1;i<n*2+1;i++)
	{
		if(sum[i]==T)
		{
			Ans++;
		}
	}
	printf("%lld",Ans-2);
	return 0;
}
2024/3/23 14:13
加载中...