比赛 |
不平凡的世界 |
评测结果 |
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;
}