找出直系亲属

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[N];
int cnt,head[N],vis[N];
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;
}

HDU——3786找出直系亲属(DFS+回溯)的更多相关文章

  1. 九度OJ 1035:找出直系亲属(二叉树)

    题目1035:找出直系亲属 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1309 解决:521 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如 ...

  2. hdu3786 找出直系亲属 水题

    题意:找出直系亲属Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  3. HDU 1016 素数环(dfs + 回溯)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 一道很典型的dfs+回溯: 根据题意首先进行初始化,即第一个位置为1,然后进行dfs, ...

  4. HDU - 4763 找出特殊规律的串

    在一个Text串中找出Pattern串E以满足EAEBE,A B可以是任意串 看一眼觉得woc好难,后来看一下样例AB为空也可以 找观察一下E既是前缀也是后缀,很容易联想到next 最优情况EEE,那 ...

  5. 九度OJ 1035:找出直系亲属 (二叉树、递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2380 解决:934 题目描述:     如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外) ...

  6. 九度oj 题目1035:找出直系亲属

    题目描述:     如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild ...

  7. HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. HDU 1016 Prime Ring Problem(经典DFS+回溯)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. hdu1298 T9(手机输入法,每按一个数字,找出出现频率最高的字串,字典树+DFS)

    Problem Description A while ago it was quite cumbersome to create a message for the Short Message Se ...

随机推荐

  1. sysbench0.5安装和使用介绍

    sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况,sysbench支持MySQL.PostgreSQL.Oracle数据库OLTP测试.它 ...

  2. JSP serverlet区别与联系

    jsp是html包含java servlet是java包含html jsp请求到tomcat---tomcat封装了jsp到servlet实现. 所以jsp请求时候,会自动创建session 而不用在 ...

  3. codevs 2618 核电站问题

    时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题目描述 Description 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会 ...

  4. 微擎框架中receive.php代码分析

  5. 用dfs遍历联通块(优化)

    一.题目(CF 598D) 输入一个n x m的字符矩阵,求从某个空点出发,能碰到多少面墙壁,总共询问k次.(3 ≤m,n ≤1000,1 ≤ k ≤ min(nm,100 000)) 二.解题思路 ...

  6. SSIS 通过 WINscp 从SFTP下载文件

    1.通过SSIS的process task调用 winscp :C:\Program Files (x86)\WinSCP\WinSCP.exe /script="C:\SFTPFile\T ...

  7. Java调用存储过程出现Bug,sql语法错误

    因为SQL Server运行没有正常,检查了传入参数的值,发现问题,然后传入默认参数,解决了问题.

  8. ZOJ-1360 || POJ-1328——Radar Installation

    ZOJ地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=360 POJ地址:http://poj.org/problem?id ...

  9. CVE-2010-3333

    环境 windows xp sp3 office 2003 sp0 windbg ollydbg vmware 12.0 0x00 RTF格式 RTF是Rich TextFormat的缩写,意即富文本 ...

  10. 高德定位腾讯定位在APP上无法开启定位权限的解决方案

    [备注]公司项目中遇到的问题,如果你在团队工作其中定有不少配合方面的问题,其中的思路是可以借鉴的,因为这也许正是你们现在遇到的问题,总结的不好的地方还请多多指教 因为项目需求的确定,定位成了必不可少的 ...