HDU——3786找出直系亲属(DFS+回溯)
2016-07-01 19:22
369 查看
找出直系亲属
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1541 Accepted Submission(s): 621
Problem Description
如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A,B是C的(外)曾祖父,曾祖母,则A,B是C的great-grandparent,C是A,B的great-grandchild,之后再多一辈,则在关系上加一个great-。
Input
输入包含多组测试用例,每组用例首先包含2个整数n(0<=n<=26)和m(0<m<50), 分别表示有n个亲属关系和m个问题, 然后接下来是n行的形式如ABC的字符串,表示A的父母亲分别是B和C,如果A的父母亲信息不全,则用-代替,例如A-C,再然后是m行形式如FA的字符串,表示询问F和A的关系。
当n和m为0时结束输入。
Output
如果询问的2个人是直系亲属,请按题目描述输出2者的关系,如果没有直系关系,请输出-。
具体含义和输出格式参见样例.
Sample Input
3 2
ABC
CDE
EFG
FA
BE
0 0
Sample Output
great-grandparent
-
这题真是醉了,有一个输出语句的循环少减了个1,WA一下午。
代码:
#include<iostream> #include<algorithm> #include<cstdlib> #include<sstream> #include<cstring> #include<cstdio> #include<string> #include<deque> #include<stack> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define INF 0x3f3f3f3f #define MM(x) memset(x,0,sizeof(x)) #define MMINF(x) memset(x,INF,sizeof(x)) typedef long long LL; const double PI=acos(-1.0); const int N=1010; struct info { int to; int pre; int w; }; info E ; int cnt,head ,vis ; int r; inline void add(int s,int t,int dx) { E[cnt].to=t; E[cnt].pre=head[s]; E[cnt].w=dx; head[s]=cnt++; } void init() { memset(head,-1,sizeof(head)); cnt=0; } void dfsdown(int s,int t,int sum) { if(s==t) { r=sum; return ; } for (int i=head[s]; i!=-1; i=E[i].pre) { int v=E[i].to; if(!vis[v]&&E[i].w==-1) { vis[v]=1; dfsdown(v,t,sum+E[i].w); vis[v]=0; } } } void dfsup(int s,int t,int sum) { if(s==t) { r=sum; return ; } for (int i=head[s]; i!=-1; i=E[i].pre) { int v=E[i].to; if(!vis[v]&&E[i].w==1) { vis[v]=1; dfsup(v,t,sum+E[i].w); vis[v]=0; } } } int main(void) { int i,j,n,m; char rela[5],quer[5]; while (~scanf("%d%d",&n,&m)&&(n||m)) { init(); for (i=0; i<n; i++) { scanf("%s",rela); if(rela[1]!='-') { add(rela[0]-'A',rela[1]-'A',1); add(rela[1]-'A',rela[0]-'A',-1); } if(rela[2]!='-') { add(rela[0]-'A',rela[2]-'A',1); add(rela[2]-'A',rela[0]-'A',-1); } } for (i=0; i<m; i++) { r=INF; scanf("%s",quer); if(quer[0]==quer[1]) { puts("-"); continue; } vis[quer[0]-'A']=1; dfsdown(quer[0]-'A',quer[1]-'A',0); vis[quer[0]-'A']=0; if(r==INF) { vis[quer[0]-'A']=1; dfsup(quer[0]-'A',quer[1]-'A',0); vis[quer[0]-'A']=0; if(r==INF) puts("-"); else { if(r==1) puts("child"); else if(r==2) puts("grandchild"); else { for (j=0; j<r-2; j++) printf("great-"); puts("grandchild"); } } } else//子代关系 { r=-r; if(r==1) puts("parent"); else if(r==2) puts("grandparent"); else { for (j=0; j<r-2; j++) printf("great-"); puts("grandparent"); } } } } return 0; }
相关文章推荐
- Hadoop概念学习系列之hadoop生态圈点滴(二十一)
- 弥补学生时代的遗憾~C#注册表情缘
- java开发编译器:构建LR语法的有限状态自动机
- uva12325(Zombie's Treasure Chest/宝箱)=>多种方式枚举
- 简单冒泡排序的时间复杂度及其两种优化
- butterknife框架的使用
- shell编程- 键盘输入变量
- PHP中header的作用
- UVa12325 宝箱(两种枚举方法)
- 半路出家的程序员
- Tomcat中server.xml配置及Context的配置直接引用工程
- 用hibernate实现动态查询+分页的模板,另附struts2的标签在分页中的使用
- tomcat7.0中外置的Context配置
- 中断与异常、时钟源、文件系统、设备驱动
- hbase 协处理器
- org.eclipse.graphiti.ui.editor.DiagramEditorInput.<init...
- 通过Gradle来下载依赖的jar包
- 主从复制之莫名少表
- BIEE 11g 系统临时文件说明
- Unique Paths