记录编号 214211 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011] 聪聪可可 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 0.188 s
提交时间 2015-12-14 20:56:11 内存使用 1.14 MiB
显示代码纯文本
#include<cstdio>
int n,u,v,w,shu,first[21000];
struct bian
{
	int v,w,nx;
}o[51000];
inline void add(int u,int v,int w)
{
	o[++shu].v=v;
	o[shu].w=w;
	o[shu].nx=first[u];
	first[u]=shu;
}
bool flag[21000];
int ans,root,now,S,num[3],s[21000],d[21000];
inline void dfs(int x,int last)
{
	s[x]=1;
	++num[d[x]%3];
	for(int i=first[x];i;i=o[i].nx)
		if(o[i].v!=last&&!flag[o[i].v])
		{
			d[o[i].v]=d[x]+o[i].w;
			dfs(o[i].v,x);
			s[x]+=s[o[i].v];
		}
	if(s[x]>S&&s[x]-S<now)
	{
		now=s[x]-S;
		root=x;
	}
}
inline void DFS(int x)
{
	flag[x]=1;
	d[x]=0;
	dfs(x,x);
	ans+=num[0]*num[0]+(num[1]*num[2]<<1);
	for(int i=first[x];i;i=o[i].nx)
		if(!flag[o[i].v])
		{
			S=s[o[i].v]>>1;
			now=0x7fffffff;
			num[0]=num[1]=num[2]=0;
			dfs(o[i].v,x);
			ans-=num[0]*num[0]+(num[1]*num[2]<<1);
			num[0]=num[1]=num[2]=0;
			DFS(root);
		}
}
int main()
{
	freopen("cckk.in","r",stdin);
	freopen("cckk.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<n;++i)
	{
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
	}
	now=0x7fffffff;
	S=n>>1;
	dfs(1,1);
	num[0]=num[1]=num[2]=0;
	DFS(root);
	int a=ans,b=n*n,c;
	while(b)
	{
		c=b;
		b=a%b;
		a=c;
	}
	printf("%d/%d",ans/a,n*n/a);
}