您的位置:首页 > 编程语言 > C语言/C++

CSP考试 2015年03月第4题 C语言实现

2016-04-07 07:44 405 查看








#include <stdio.h>
//找叶子
main()
{
//int NUM1=4;
//int NUM2=4;
int NUM1;
int NUM2;
scanf("%d",&NUM1);
scanf("%d",&NUM2);
int NUM=NUM1+NUM2;
int a[NUM+1];
a[0]=-1;
a[1]=0;
int i;
for(i=2;i<=NUM;i++)
{
scanf("%d",&a[i]);
}
/*
a[2]=1;
a[3]=2;
a[4]=2;
a[5]=3;
a[6]=4;
a[7]=4;
a[8]=4;*/
//关于叶子的信息
int b[NUM+1];

int j;
for(i=0;i<(NUM+1);i++)
{
b[i]=-1;
}
for(i=0;i<(NUM+1);i++)
{
//printf("a[%d]=%d\n",i,a[i]);
//printf("b[%d]=%d\n",i,b[i]);
}
//printf("\n");
/*
for(i=0;i<(NUM+1);i++)
{
//printf("a[%d]=%d\n",i,a[i]);
printf("b[%d]=%d\n",i,b[i]);
}*/

for(i=0;i<(NUM+1);i++)
{
for(j=0;j<(NUM+1);j++)
{
if(a[j]==i)
{
b[i]=0;//不是叶子
}
}
}
for(i=0;i<(NUM+1);i++)
{
//printf("a[%d]=%d\n",i,a[i]);
//printf("b[%d]=%d\n",i,b[i]);
}

//给的输入已排好顺序
//层数
int e[NUM+1];
for(i=0;i<=NUM;i++)
{
e[i]=-1;
}
e[1]=1;
for(i=1;i<=NUM;i++)
{
//for(j=1;j<=NUM1;j++)
{
if(e[a[i]]!=-1)
{
e[i]=e[a[i]]+1;
//	break;
}
}
}
//printf("\n");
for(i=0;i<(NUM+1);i++)
{
//printf("a[%d]=%d\n",i,a[i]);
//printf("e[%d]=%d\n",i,e[i]);
}

//仅限叶子的比较
int hello(int i,int j)
{
int f[NUM+1];
int k;
for(k=0;k<=NUM;k++)
{
f[k]=-1;
}
int h;
int temp;
for(h=i;a[h]!=-1;h=a[h])
{
f[h]=-2;
}
for(h=j;a[h]!=-1;h=a[h])
{
if(f[h]==-2)
{
f[h]=-3;
temp=e[h];
break;
}
f[h]=-2;
}
//printf("\n");
for(k=0;k<(NUM+1);k++)
{
//printf("a[%d]=%d\n",i,a[i]);
//printf("f[%d]=%d\n",k,f[k]);
}
//printf("temp=%d\n",temp);
temp=e[i]+e[j]-2*temp;
//printf("temp=%d\n",temp);
return temp;
}
hello(5,6);
int kaoshi=0;
for(i=0;i<(NUM+1);i++)
{
if(b[i]==0)//不是叶子
{
continue;
}
for(j=0;j<(NUM+1);j++)
{
if(b[j]==0)
{
continue;
}
int jg=hello(i,j);
if(kaoshi<jg)
{
kaoshi=jg;
}
}
}
printf("%d\n",kaoshi);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: