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;
    }
  • 相关阅读:
    linux日常。
    tp5中的config类和config助手函数
    TP5隐藏index.php
    TP5读取数据概述
    TP5的安装部署概要
    eclipse4.7中文包安装方法。
    利用mysqldump备份magento数据库
    MySQL 基础知识
    PHP 基础知识
    妖怪与和尚过河问题
  • 原文地址:https://www.cnblogs.com/Blackops/p/5766305.html
Copyright © 2011-2022 走看看