// 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. [LeetCode] Scramble String 字符串 dp

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

  2. Day 21 Object_oriented_programming_2

    继承实现原理 python中的类可以同时继承多个父类,继承的顺序有两种:深度优先和广度优先. 一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找 示例解析: 没有 ...

  3. 多线程设计模式 : Master-Worker模式

    Master-Worker是常用的并行计算模式.它的核心思想是系统由两类进程协作工作:Master进程和Worker进程.Master负责接收和分配任务,Worker负责处理子任务.当各个Worker ...

  4. C语言联合体

    C语言联合体Unions实例代码教程 - 联合是一种特殊的数据类型在C语言中,使您可以存储不同的数据类型相同的内存位置. 联合是一种特殊的数据类型在C语言中,使您可以存储不同的数据类型相同的内存位置. ...

  5. Python Challenge 第七关

    第七关,只有一张图片,右键源代码也什么都没有,只是这图片上有一行类似马赛克一样的部分.看来答案只有在这张图上找了.下载了图片,去网上搜一下有什么库可以处理图像.搜到了一个PIL,发现安装的python ...

  6. AC日记——Oulipo poj 3461

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37958   Accepted: 15282 Description The ...

  7. ios 地图,系统升级为12后,进入地图,大头针全部默认展开问题,以及在选择不同距离的情况下,如何刷新地图的区域范围

    1.第一个问题,大头针在ios12,默认展开问题,需要设置大头针视图的默认选中属性为NO - (MKAnnotationView *)mapView:(MKMapView *)mapView view ...

  8. Codeforces 903F Clear The Matrix(状态压缩DP)

    题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...

  9. bzoj 5125: [Lydsy1712月赛]小Q的书架

    新学了一波 决策单调性 dp 套路.... 这种dp一般是长这样的 => f[i][j] = max/min  { f[i-1][k] + cost(k+1,j)} ,其中cost函数满足四边形 ...

  10. linux运维(重点)

    linux 添加系统变量: export log="log-all-$(date +%Y-%m-%d).php" export log="log-all-$(date + ...