家谱 解题报告
2015-09-21 19:45
183 查看
家谱 解题报告
v家谱
v【问题描述】
v 现代的人对于本家族血统越来越感兴趣,现在给出充足的父子关系,请你编写程序找到某个人的最早的祖先。
v【输入格式】gen.in
v 输入文件由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系由二行组成,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字;接下来用?name的形式表示要求该人的最早的祖先;最后用单独的一个$表示文件结束。规定每个人的名字都有且只有6个字符,而且首字母大写,且没有任意两个人的名字相同。最多可能有1000组父子关系,总人数最多可能达到50000人,家谱中的记载不超过30代。
v【输出格式】gen.out
v 按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式:本人的名字+一个空格+祖先的名字+回车。
【解题思路】
只是一个普通的并查集问题,然而字符串的处理挺麻烦,然后遇到了神奇的BUG。。。
需要用到映射数组(关联式容器),实现编号到名字、名字到编号的互相转换;
需要注意的是,给名字的编号必须是它第一次出现的编号,后面的不能覆盖,,这就是我出现的bug之一。。
其余的应该很好写吧。。
【代码】
就是刚才提到的那个BUG,,,不过我找错找得很快。。。
低级BUG(⊙o⊙)…
v家谱
v【问题描述】
v 现代的人对于本家族血统越来越感兴趣,现在给出充足的父子关系,请你编写程序找到某个人的最早的祖先。
v【输入格式】gen.in
v 输入文件由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系由二行组成,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字;接下来用?name的形式表示要求该人的最早的祖先;最后用单独的一个$表示文件结束。规定每个人的名字都有且只有6个字符,而且首字母大写,且没有任意两个人的名字相同。最多可能有1000组父子关系,总人数最多可能达到50000人,家谱中的记载不超过30代。
v【输出格式】gen.out
v 按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式:本人的名字+一个空格+祖先的名字+回车。
【解题思路】
只是一个普通的并查集问题,然而字符串的处理挺麻烦,然后遇到了神奇的BUG。。。
需要用到映射数组(关联式容器),实现编号到名字、名字到编号的互相转换;
需要注意的是,给名字的编号必须是它第一次出现的编号,后面的不能覆盖,,这就是我出现的bug之一。。
其余的应该很好写吧。。
【代码】
#include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; map<string,int>name; map<int,string>num; map<string,bool>b; int f[50005]; string s,ss; int i,j,k,len,father; bool pd=false; int find(int x) { if (f[x]==x) return f[x]; f[x]=find(f[x]); return f[x]; } void merge(int x,int y) { int f1=find(x); int f2=find(y); f[f1]=f2; return; } int main() { freopen("gen.in","r",stdin); freopen("gen.out","w",stdout); for (i=1;i<=50000;++i) f[i]=i; i=0; while (cin>>s) { if (s=="$") break; if (s[0]=='#'||s[0]=='+') { len=s.length(); ss=s.substr(1,len-1); if (!b[ss]) { i++; name[ss]=i; b[ss]=true; num[i]=ss; if (s[0]=='#') father=i; if (s[0]=='+') merge(i,father); } else { if (s[0]=='#') father=name[ss]; if (s[0]=='+') merge(name[ss],father); } } if (s[0]=='?') { if(pd==false) for (j=1;j<=i;++j) k=find(j); pd=true; len=s.length(); ss=s.substr(1,len-1); cout<<ss; cout<<" "; cout<<num[f[name[ss]]]<<endl; } } return 0; }【犯的错误】
就是刚才提到的那个BUG,,,不过我找错找得很快。。。
低级BUG(⊙o⊙)…
相关文章推荐
- UI_无限滚动相册
- SQL Server备份、完整备份,差异备份、日志备份
- 第一个AWK程序的尝试
- 创建可复用单链表
- Ajax 完整教程1
- 协同程序(coroutine)
- PHP生成条形码
- java中遍历属性字段及值
- 研磨数据结构与算法-14红黑树
- 机器学习算法
- datepicker
- hdu3549 最大流
- 修改xcode模版文件
- UI03_LTView
- 猫猫学iOS 之BLOCK的妙用_利用block实现链式编程
- 0921 TarBar&枚举 蓝懿
- CountDownLatch的介绍和使用
- Android基础入门教程——2.4.6 ListView的数据更新问题
- makefile文件的编写
- phpunit.xml 用法