比赛 不平凡的世界 评测结果 AAAWWTEEEE
题目名称 不平凡的许愿树 最终得分 30
用户昵称 lxtgogogo 运行时间 5.931 s
代码语言 C++ 内存使用 67.82 MiB
提交时间 2015-11-05 11:03:10
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<queue>
#include<ctime>
#include<cstdlib>
using namespace std;

int n=0;
int dis[1501][1501]={};
int tree[1501][1501]={},len[1501]={};
int num[1501][100][100]={},t[1501][100]={};
int q[1600][2]={},head=0,tail=0;//0表示节点,1表示距离
bool f[1501]={};//是否进队

void init(){
	memset(dis,10,sizeof(dis));
	scanf("%d",&n);
	int u=0,v=0;
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		dis[u][v]=1;
		dis[v][u]=1;
		tree[u][++len[u]]=v;
		tree[v][++len[v]]=u;
	}
}
void work1(){
	int cnt=0;
	for(int i=1;i<=n;i++)	dis[i][i]=0;
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(dis[i][j]>dis[i][k]+dis[k][j])	dis[i][j]=dis[i][k]+dis[k][j];
	for(int i=1;i<=n-2;i++)
		for(int j=i+1;j<=n-1;j++)
			for(int k=j+1;k<=n;k++)
				if(dis[i][j]==dis[j][k] && dis[i][j]==dis[i][k])	cnt++;
	cout<<cnt%338+1<<' '<<(cnt+233)%338+1<<endl;
}
void work2(){//拼rp的时候到了!
	long long cnt=0;
	for(int i=1;i<=n;i++)//O(n^2)求距离
	{
		memset(q,0,sizeof(q));
		memset(f,0,sizeof(f));
		tail=0;
		q[++tail][0]=i;
		q[tail][1]=0;
		f[i]=true;
		dis[i][i]=0;
		for(head=0;head<=tail;head++)
		{
			int x=q[head][0];
			for(int j=1;j<=len[x];j++)
			{
				if(!f[tree[x][j]])
				{
					int y=tree[x][j];
					f[y]=true;
					q[++tail][0]=y;
					q[tail][1]=q[head][1]+1;
					t[i][q[tail][1]]++;
					num[i][q[tail][1]][t[i][q[tail][1]]]=y;
					dis[i][y]=q[tail][1];
				}
			}
		}
	}
	memset(f,0,sizeof(f));
	for(int i=1;i<=n;i++)//枚举每个点
	{
		f[i]=true;
		int d=0;//枚举到这个点的距离
		while(t[i][++d])
		{
			if(t[i][d]<2)	continue;
			for(int j=1;j<t[i][d];j++)
				for(int k=j+1;k<=t[i][d];k++)
					if(dis[num[i][d][j]][num[i][d][k]]==d && !f[num[i][d][j]] && !f[num[i][d][k]])	cnt++;
		}
	}
	cout<<cnt%338+1<<' '<<(cnt+233)%338+1<<endl;
}
void work3(){
	cout<<1<<' '<<1<<endl;
}
int main(){
	freopen("hopetree.in","r",stdin);
	freopen("hopetree.out","w",stdout);
	
	init();
	if(n<=100)	work1();
	else if(n<=1500)	work2();
	else	work3();
	
	fclose(stdin);fclose(stdout);
	return 0;
}