ZOJ 1141 Closest Common Ancestors(LCA)

7 篇文章 0 订阅

注意:poj上的数据与zoj不同,第二处输入没有逗号 ' , '

题意:输出测试用例中是最近公共祖先的节点,以及这个节点作为最近公共祖先的次数。

思路:直接求,两个节点一直往上爬,知道爬到同一个节点,这个节点即为最近公共祖先。

这道题的输入挺······,空格可以随意输入。Note that white-spaces (tabs, spaces and line breaks) can be used freely in the input.

5  :  (  3  )

scanf("%d%1s%1s%d%1s",&fa,s1,s2,&m,s3);    //第一处输入,      s1为":"      s2为"("      s3为")"。 

(2,3)
scanf("%1s%d%1s%d%1s",s1,&a,s2,&b,s3);    //第二处输入,       s1为"("      s2为","      s3为")"。 

%1s读取一个字符

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;

const int N=1000;
int f[N];//
int sum[N];//记录次数

int depth(int x){//计算层数
	int dep=0;
	while(x!=-1){
		x=f[x];
		dep++;
	}
	return dep;
}
int main(){
	char s1[10],s2[10],s3[10];  
	int n;
	char c;
	while(scanf("%d",&n)!=EOF){//树的节点个数
		memset(f,-1,sizeof(f));
		memset(sum,0,sizeof(sum));
		int tempn=n;
		while(n--){
			int fa,so;
			int m;
			scanf("%d%1s%1s%d%1s",&fa,s1,s2,&m,s3); //注意输入!!!
			while(m--){
				scanf("%d",&so);
				f[so-1]=fa-1;
			}
		}
		int i;
		for(i=0;f[i]>=0;i++);
		int n2;
		scanf("%d",&n2);//要查询的最近公共祖先的节点对数
		while(n2--){
			int a,b;
			scanf("%1s%d%1s%d%1s",s1,&a,s2,&b,s3);//注意输入!!!
			a--;b--;
			int depa=depth(a);
			int depb=depth(b);
			while(a!=b){
				if(depa>depb)a=f[a],depa--;
				else b=f[b],depb--;
			}
			sum[a]++;
		}
		for(i=0;i<tempn;i++){
			if(sum[i]>0)
				printf("%d:%d\n",i+1,sum[i]);
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值