zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    LeetCode 189. Rotate Array
    LeetCode 965. Univalued Binary Tree
    LeetCode 111. Minimum Depth of Binary Tree
    LeetCode 104. Maximum Depth of Binary Tree
    Windows下MySQL的安装与配置
    LeetCode 58. Length of Last Word
    LeetCode 41. First Missing Positive
    LeetCode 283. Move Zeroes
    《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》读后感
    删除docker下的镜像
  • 原文地址:https://www.cnblogs.com/Blackops/p/5766305.html
Copyright © 2011-2022 走看看