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

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;
}
原文地址:https://www.cnblogs.com/Blackops/p/5766305.html