// ConsoleApplication10.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std; class Solution {
public:
/**
* 返回git树上两点的最近分割点
*
* @param matrix 接邻矩阵,表示git树,matrix[i][j] == '1' 当且仅当git树中第i个和第j个节点有连接,节点0为git树的跟节点
* @param indexA 节点A的index
* @param indexB 节点B的index
* @return 整型
*/
int getSplitNode(vector<string> matrix, int indexA, int indexB) {
if (indexA >= matrix.size() || indexB >= matrix.size())
{
return 0;
}
vector<int> depth;
vector<int> parent;
breadTraverl(matrix, depth, parent);
int p=0;
//如果同一深度,父节点相同,则分割点为父节点
//同一深度,父节点不同,寻找父节点的父节点
//不同深度,从深度高的往上过滤,每次过滤的时候判断是否达到低的节点的深度;没有之前,要判断低的节点是否是深的节点的父节点
if (depth[indexA] == depth[indexB])
{
int a = indexA;
int b = indexB;
while (parent[a]!=parent[b])
{
a = parent[a];
b = parent[b];
}
p= parent[a];
}
else {
int a = indexA;//a对应的节点深
int b = indexB;
bool flag = false;//未找到分割点
if (depth[indexA] < depth[indexB])
{
a = indexB;
b = indexA;
}
while (depth[a]!=depth[b])//当节点a和节点b不在同一个深度
{
if (parent[a] == b)
{
p = b;
flag = true;
break;
}
else
{
--a;
}
}
if (flag == false)
{
int a = indexA;
int b = indexB;
while (parent[a] != parent[b])
{
a = parent[a];
b = parent[b];
}
p = parent[a];
} }
return p;
}
//广度优先遍历图
void breadTraverl(vector<string> matrix, vector<int> &depth, vector<int> &parent)
{
//visited数组,如何visited[i]为false,则被访问过
vector<bool> visited;
// vector<int> depth;
// vector<int> parent; for (int i = 0;i < matrix.size();++i)
{
visited.push_back(true);
depth.push_back(0);
parent.push_back(0);
}
cout << "V_" << 0 << " ";
visited[0] = false;
depth[0] = 0;
parent[0] = 0;//根节点的本身设置为自己
for (int i = 0;i < matrix.size();++i)
{
// cout << "matrix[0].length():" << matrix[0].length() << endl;
for (int j = 0;j < matrix[0].length();++j)
{
//注意:此处的matrix[i][j]应该为'1'而不是1
if ((matrix[i][j] == '1')&& (visited[j] == true))
{
cout << "matrix[" << i << "]"<<"["<<j<<"]:" << matrix[i][j] << " ";
cout << "visited["<<j<<"]:" << visited[j] << endl;
cout << "V_" << j << " ";
parent[j] = i;
depth[j] = depth[i] + 1;
visited[j] = false;
}
}
}
cout << endl;
for (int i = 0;i < matrix.size();i++)
{
cout << i << ":";
cout << "parent:" << parent[i] << " ";
cout << "depth:" << depth[i] << endl;
}
} }; int main()
{
Solution so;
vector<string> matrix;
string str1 = "01011";
string str2 = "10100";
string str3 = "01000";
string str4 = "10000";
string str5 = "10000";
matrix.push_back(str1);
matrix.push_back(str2);
matrix.push_back(str3);
matrix.push_back(str4);
matrix.push_back(str5);
cout<<"结果:"<<so.getSplitNode(matrix, 0, 2);
cout << endl;
return 0;
}

git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0的更多相关文章

  1. 关于分布式代码管理工具git

    一.安装 Step1  进入官网https://www.git-scm.com/download/下载,然后安装,一直“下一步”即可 Step2  验证是否安装成功,在任意地方右键,菜单中含有Git ...

  2. 代码管理工具 (含git、npm、gulp)

    1 Git 分布式代码管理工具(基于Linux,可在本地进行提交)代码同时储存在本地和服务器中 ① Git基本操作命令 (1)初始化,创建初始化仓库 git init ------- 文件初始化,初始 ...

  3. 代码管理工具 Git

    之前一直使用微软的代码管理工具TFS(Team Foundation Server)..NET CORE 2.0的发布后,考虑到.NET CORE项目可以跨平台,准备把项目迁移到.NET CORE 环 ...

  4. 代码管理工具-Git基础介绍及常用技巧

    目录 Git起源 基本概念 Branch.HEAD和Commit tree Git分支 git merge 和 git rebase 的区别和抉择 与远程仓库的交互 关于一些实际开发场景的问题和解决方 ...

  5. 代码管理工具 --- git的学习笔记二《git的工作原理》

    通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...

  6. Git代码管理工具

    Git代码管理工具 Git 是分布式的源代码管理工具,这点区别于svn -让源代码可以被追溯,主要是记录了每次的更新了什么,如果新版本不想用,那么则可以退回之前的版本 -Git 是Linux之父当年为 ...

  7. 代码管理工具之git的学习

    1.代码管理工具git的学习  http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 2.github的使用帮助   https:// ...

  8. 通过代码管理工具 git 完成一次完整的代码管理过程

    1.从公共远程fork一份自己的本地远程之后,从本地远程 clone 到本地 2.将本地代码跟公共远程代码做关联配置 git remote add upstream https://github.co ...

  9. GIT: 分布式开发 代码管理工具使用命令大全

    代码管理工具: GIT     什么是GIT? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目 Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常 ...

随机推荐

  1. LOJ#2083. 「NOI2016」优秀的拆分

    $n \leq 30000$的字符串,问其所有子串的所有AABB形式的拆分有多少种.$t \leq 10$组询问. $n^3$过80,$n^2$过95,鬼去写正解.. $n^2$:先枚举一次算每个位置 ...

  2. A Wasserstein Distance[贪心/模拟]

    链接:https://www.nowcoder.com/acm/contest/91/A来源:牛客网 最近对抗生成网络(GAN)很火,其中有一种变体WGAN,引入了一种新的距离来提高生成图片的质量.这 ...

  3. python第三方库安装-多种方式

    第一种方式:安装whl文件 pip install whatever.whl   第二种方式:安装tar.gz文件 一般是先解压,然后进入目录之后,有setup.py文件 通过命令 python se ...

  4. [开源] FreeSql AOP 功能模块

    前言 FreeSql 是一个功能强大的 .NETStandard 库,用于对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.6.1+(QQ群:4336 ...

  5. Best Cow Fences

    题目描述 Farmer John's farm consists of a long row of N (1 <= N <= 100,000)fields. Each field cont ...

  6. JAVA基础之Set接口

    个人理解: Set接口是Collection接口的子类,其继承了所有方法,HashSet集合则实现了Set接口,其内部存储数据时依靠哈希表,一个类似数组和链表的结合体.设置空集合时,存在默认的容量和加 ...

  7. (入门SpringBoot)SpringBoot结合定时任务task(十)

    SpringBoot整合定时任务task 使用注解EnableScheduling在启动类上. 定义@Component作为组件被容器扫描. 表达式生成地址:http://cron.qqe2.com ...

  8. PHP amqp扩展安装

    1.安装 rabbitmq-c下载地址:https://github.com/alanxz/rabbitmq-c> mkdir build > cd build> cmake -DO ...

  9. 【POI】导出xls文件报错:The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook

    使用POI导出xls文件,由于数据过多,导致导出xls报错如下: The maximum number of cell styles was exceeded. You can define up t ...

  10. Cookie常用方法封装Utils

    1.查询某个指定的cookie package com.sun.etalk.cookie; import javax.servlet.http.Cookie; public class CookieU ...