您的位置:首页 > 其它

SDJZUOJ 1032 一家人(并查集入门)

2013-07-26 09:11 162 查看
SDJZUOJ  1032  一家人(并查集入门)             题目链接:http://sdjzu.acmclub.com/index.php?app=problem_title&id=147&problem_id=1032

并查集水

题目分析:一个一维数组就能解决问题,下标代表人的编号,内容代表这个人父亲的编号。这样一个一维数组就描述出了一个树的结构。顶点没有父亲,所以它的值是0。所以我们可以从小明找到顶点,用一个计数器记下走了几步,小宇同样,比较两个计数器的值,哪个大,哪个就是晚辈。

code:

#include<stdio.h>
int main()
{
int ak[3000],i,a,b,n,counter1,counter2;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
ak[a]=b;
}
i=1;
counter1=counter2=0;
while(ak[i])
{
i=ak[i];
counter1++;
}
i=2;
while(ak[i])
{
i=ak[i];
counter2++;
}
if(counter1<counter2)printf("You are my younger\n");
else if(counter2<counter1)printf("You are my elder\n");
else printf("You are my brother\n");
}
return 0;
}
PS:第一次数组开30居然runtime error,无语了果断开3000……

下面这个不知是不是标程,也不知用什么思想做的,待研究……

code:

#include<cstdio>
#include<map>
using namespace std;

int main()
{
int n,a,b,na[5000],nb[5000];
map<int,int> p;
while(scanf("%d",&n)!=EOF)
{
p.clear();
while(n--)
{
scanf("%d%d",&a,&b);
p[a]=b;
}
int k1=0;
na[k1]=p[1];
while(p.count(na[k1]))
{
int t;
t=p[na[k1]];
k1++;
na[k1]=t;
}
int k2=0;
nb[k2]=p[2];
while(p.count(nb[k2]))
{
int t;
t=p[nb[k2]];
k2++;
nb[k2]=t;
}
int flag=0;
for(int i=0;i<=k1;i++)
{
if(flag)
break;
for(int j=0;j<=k2;j++)
if(na[i]==nb[j])
{
if(i<j)
printf("You are my younger\n");
else if(i>j)
printf("You are my elder\n");
else
printf("You are my brother\n");
flag=1;
break;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: