感觉自己贼菜。我就知道会有样例超时的。代码写的很繁琐。冗余度还很高。dfs写了两边。蠢得一笔。
第一个dfs找出最大的深度。第二个dfs把满足这个深度的所有节点都打印出来。
第一遍交的时候说我内存超出了。于是很萨比的换成横向二维的然后又写了一个函数表示两点之间是否有链接。
以及dfs函数如果带多个参数可以避免回溯时修改参数的尴尬。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 10010
int pre[maxn];
int edge[maxn][2];
int visit[maxn];
int ans,n;
int output[maxn];
int curlen,maxlen;
int dis(int x,int y)
{
for(int i=1;i<n;i++)
if((edge[i][0]==x&&edge[i][1]==y)||(edge[i][0]==y&&edge[i][1]==x))
return 1;
return 0;
}
int find(int x)
{
return pre[x]==x?x:pre[x]=find(pre[x]);
}
int Union(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)
return 1;
else
{
pre[y]=x;
return 0;
}
}
void dfs(int x)
{
if(curlen>maxlen)
{
maxlen=curlen;
ans=x;
}
int i;
for(i=1;i<=n;i++)
{
if(dis(x,i)==1&&visit[i]==0)
{
visit[i]=1;
curlen++;
dfs(i);
curlen--;
}
}
}
void dfs1(int x)
{
if(curlen==maxlen)
{
output[x]=1;
return;
}
int i;
for(i=1;i<=n;i++)
{
if(dis(x,i)==1&&visit[i]==0)
{
visit[i]=1;
curlen++;
dfs1(i);
curlen--;
}
}
}
int main()
{
int i,j,k,flag;
int record[maxn];
memset(output,0,sizeof(output));
memset(record,0,sizeof(record));
flag=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
pre[i]=i;
curlen=0;
maxlen=0;
for(i=1;i<n;i++)
{
scanf("%d %d",&edge[i][0],&edge[i][1]);
k=Union(edge[i][0],edge[i][1]);
if(k==1)
flag=1;
}
j=0;
for(i=1;i<=n;i++)
record[find(i)]=1;
for(i=1;i<=n;i++)
if(record[i]==1)
j++;
if(flag==1||j>1)
printf("Error: %d components",j);
else
{
for(i=1;i<=n;i++)
{
curlen=0;
memset(visit,0,sizeof(visit));
visit[i]=1;
dfs(i);
}
for(i=1;i<=n;i++)
{
memset(visit,0,sizeof(visit));
curlen=0;
visit[i]=1;
dfs1(i);
}
for(i=1;i<=n;i++)
{
if(output[i]==1)
printf("%d\n",i);
}
}
return 0;
}