6.dfs----家谱

题目:

代码:

import java.util.Scanner;

public class Main {
	/*
	 * 思路:
测试数据
4
1 2
1 3
2 4

正常输出:
3 1 0 0 
	 * */
	static int n;//家谱中的总人数
	static int[][] g;//存放家谱(2列分别表示父母、孩子)
	static int[] ans;//存放每个人的直系后代数
	static int cnt=0;//当前人的后代数
	static boolean[] flag;//标记是不是孩子,如果是孩子,为true
	public static void main(String[] args){
		//1.输出相关值
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();//n

		g = new int[n-1][2];
		ans = new int[n+1];
		flag = new boolean[n+1];
		
		for(int i=0;i<n-1;i++) {
			g[i][0] = sc.nextInt();
			g[i][1] = sc.nextInt();
			flag[g[i][1]] =true;
		}//for
		
		//2.找到根祖先
		int root=0;
		for(int i=1;i<=n;i++) {
			if(!flag[i]) {//根节点
				root=i;
			}
		}
		//2.深度优先遍历,从根节点开始进行遍历
		dfs(root);	
		for(int i=1;i<=n;i++) {
			System.out.print(ans[i]+" ");
		}
	}
	private static int dfs(int root) {
		int cnt=0;
		for(int i=0;i<g.length;i++) {//遍历所有祖先为root的情况
			if(g[i][0]==root) {
				cnt+=dfs(g[i][1]);
			}
		}
		ans[root]=cnt;
		return cnt+1;
	}
	
}
	

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值