HDU——3786找出直系亲属(DFS+回溯)
找出直系亲属
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1541 Accepted Submission(s): 621
当n和m为0时结束输入。
具体含义和输出格式参见样例.
ABC
CDE
EFG
FA
BE
0 0
-
这题真是醉了,有一个输出语句的循环少减了个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+回溯)的更多相关文章
- 九度OJ 1035:找出直系亲属(二叉树)
题目1035:找出直系亲属 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1309 解决:521 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如 ...
- hdu3786 找出直系亲属 水题
题意:找出直系亲属Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 1016 素数环(dfs + 回溯)
嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 一道很典型的dfs+回溯: 根据题意首先进行初始化,即第一个位置为1,然后进行dfs, ...
- HDU - 4763 找出特殊规律的串
在一个Text串中找出Pattern串E以满足EAEBE,A B可以是任意串 看一眼觉得woc好难,后来看一下样例AB为空也可以 找观察一下E既是前缀也是后缀,很容易联想到next 最优情况EEE,那 ...
- 九度OJ 1035:找出直系亲属 (二叉树、递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2380 解决:934 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外) ...
- 九度oj 题目1035:找出直系亲属
题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild ...
- HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)
哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 1016 Prime Ring Problem(经典DFS+回溯)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu1298 T9(手机输入法,每按一个数字,找出出现频率最高的字串,字典树+DFS)
Problem Description A while ago it was quite cumbersome to create a message for the Short Message Se ...
随机推荐
- Java 语言中一个字符占几个字节?
Java中理论说是一个字符(汉字 字母)占用两个字节. 但是在UTF-8的时候 new String("字").getBytes().length 返回的是3 表示3个字节 作者: ...
- VC操作WORD文档总结
一.写在开头 最近研究word文档的解析技术,我本身是VC的忠实用户,看到C#里面操作WORD这么舒服,同时也看到单位有一些需求,就想尝试一下,结果没想到里面的技术点真不少,同时网络上的共享资料很多, ...
- Android(java)学习笔记140:常用的对话框
一.常见对话框属性: 1. AlertDialog.Builder属性 • setTitle: 为对话框设置标题 :• setIcon : 为对话框设置图标:• setMessage: 为对话框设置 ...
- vector的基本用法
#include<iostream> #include<vector> #include<algorithm> using namespace std; int m ...
- shell脚本,计算学生分数的题目。
1.计算学生平均分数的值是多少? 2.计算每门课都大于80分的学生姓名.3.计算每门课都小于90分的学生姓名.
- Protocol(协议)、Delegate(委托)、DataSource(数据源)
这里以 UITableViewController 和 UITableView 的关系为例: //--------------------------------------------------- ...
- react入门(上)
1. ReactJS是什么? 1). Facebook开源的一个js库 2). 一个用于动态构建用户界面的js库2. React的特点 * Declarative(声明式编码) * Component ...
- fopen()和socket()的内在联系
int portone=socket(AF_INET,SOCK_STREAM, 0); printf("portone=%d",portone); printf("ope ...
- docker系列之安装配置
由于docker支持内核3.8以上的,所以我们要安装centos7系统,这个系统的内核是3.10,来支持docker使用环境 一.用UItralSo制作u盘启动 打开找到要做u盘启动的镜像 二.安装C ...
- jsDate()
var myTime=new Date();//myTime的数据类型为(typeof) object //下面得到的都为number 类型 getFullYear();年 四位数字返回年份. get ...