前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爱彼迎19年社招java面试题 求DAG图中每个点的祖先个数

爱彼迎19年社招java面试题 求DAG图中每个点的祖先个数

作者头像
ACM算法日常
发布2019-10-15 15:09:32
9010
发布2019-10-15 15:09:32
举报
文章被收录于专栏:ACM算法日常ACM算法日常

缘起

群里一个小妹妹面试爱彼迎的时候被问到的. 题目RT

DAG

例如上图, 则H的祖先个数是3个(包括它自己哈),分别是和. 而N的祖先个数是4()。

分析 此题比较tricky的地方在于的祖先和的祖先可能是同一个()但是又不能重复计数. 所以我们需要在每个顶点上维护一个HashSet. 用于记录它的祖先集合, 伊始,集合仅仅有他自己. 然后反向建图. 最后从叶子节点(即伊始出度为0的点)开始dfs. 既然是反向建图,那么求祖先就转变为求孩子的个数了. 则每从一个节点退出dfs搜索之后就可以打印答案了. 假设输入格式如下

代码语言:javascript
复制
3
A,S,E,N
S,H,N
E,N

第一行是弧的条数. 后面每一行第一个字符是弧的起点, 后面都是弧的终点

代码语言:javascript
复制
#include "stdafx.h"
#include <stdio.h>
#include <vector>
#include <set>
using namespace std;

vector<int> g[30]; //g是反向图
vector<int> root;  // root收集了反向图的根节点
set<int> a[30]; // a[i]是顶点i的祖先集合
char s[30];
int indeg[30]; // 用于找出根节点
bool v[30]; // 哪些字母出现过

typedef vector<int>::iterator vit;

void dfs(int cur)
{
	for (vit x = g[cur].begin(); x!=g[cur].end(); x++)
	{
		dfs(*x);
		a[cur].insert(a[x].begin(), a[x].end());
	}
}

int main()
{
	freopen("d:\data.in", "r", stdin);
	int n;
	scanf("%d", &n);
	for (int i = 0;i<30; i++)
	{
		a[i].insert(i);
	} // 伊始集合中只有自己
	while(n--)
	{
		scanf("%s", s);
		int b = s[0]-'A';
		v[b] = true;
		for (int i = 1;s[i]; i++)
		{
			if (s[i]==',')
			{
				continue;
			}
			g[s[i]-'A'].push_back(b);
			v[s[i]-'A'] = true;
			indeg[b]++;
		} // 反向建图
	}
	for (int i = 0;i<30;i++)
	{
		if (!indeg[i]&&v[i])
		{
			root.push_back(i);
		}
	} // 收集根节点
	for (vit x = root.begin(); x!=root.end(); x++)
	{
		dfs(*x);
	}
	for (int i = 0; i<30; i++)
	{
		if (v[i])
		{
			printf("%c的祖先有%d个\n", i+'A', a[i].size());
		}
	}
	return 0;
}

测试数据如下

代码语言:javascript
复制
3
A,S,E,N
S,H,N
E,N

运行结果

image

反正也不能提交, 也不晓得到底对不对,但是思路应该是正确的.

ps: 其实本题是有实际背景的—— 大家知道,maven项目管理的时候, 一个项目的字节码异动可能会导致多个项目重新要打包. 现在公司有若干项目,互相依赖(当然,不会有环形依赖),要你计算每个项目(记做P)的字节码修改会导致重新打包的项目的数量(包括P自己)

并不是爱彼迎变着法考算法,而是算法本身就来源于生活,抽象于生活。所以算法的力量是很大的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ACM算法日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 缘起
  • 运行结果
相关产品与服务
项目管理
CODING 项目管理(CODING Project Management,CODING-PM)工具包含迭代管理、需求管理、任务管理、缺陷管理、文件/wiki 等功能,适用于研发团队进行项目管理或敏捷开发实践。结合敏捷研发理念,帮助您对产品进行迭代规划,让每个迭代中的需求、任务、缺陷无障碍沟通流转, 让项目开发过程风险可控,达到可持续性快速迭代。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档