git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
// 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的更多相关文章
- 关于分布式代码管理工具git
一.安装 Step1 进入官网https://www.git-scm.com/download/下载,然后安装,一直“下一步”即可 Step2 验证是否安装成功,在任意地方右键,菜单中含有Git ...
- 代码管理工具 (含git、npm、gulp)
1 Git 分布式代码管理工具(基于Linux,可在本地进行提交)代码同时储存在本地和服务器中 ① Git基本操作命令 (1)初始化,创建初始化仓库 git init ------- 文件初始化,初始 ...
- 代码管理工具 Git
之前一直使用微软的代码管理工具TFS(Team Foundation Server)..NET CORE 2.0的发布后,考虑到.NET CORE项目可以跨平台,准备把项目迁移到.NET CORE 环 ...
- 代码管理工具-Git基础介绍及常用技巧
目录 Git起源 基本概念 Branch.HEAD和Commit tree Git分支 git merge 和 git rebase 的区别和抉择 与远程仓库的交互 关于一些实际开发场景的问题和解决方 ...
- 代码管理工具 --- git的学习笔记二《git的工作原理》
通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...
- Git代码管理工具
Git代码管理工具 Git 是分布式的源代码管理工具,这点区别于svn -让源代码可以被追溯,主要是记录了每次的更新了什么,如果新版本不想用,那么则可以退回之前的版本 -Git 是Linux之父当年为 ...
- 代码管理工具之git的学习
1.代码管理工具git的学习 http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 2.github的使用帮助 https:// ...
- 通过代码管理工具 git 完成一次完整的代码管理过程
1.从公共远程fork一份自己的本地远程之后,从本地远程 clone 到本地 2.将本地代码跟公共远程代码做关联配置 git remote add upstream https://github.co ...
- GIT: 分布式开发 代码管理工具使用命令大全
代码管理工具: GIT 什么是GIT? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目 Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常 ...
随机推荐
- Something about the microsoft HttpContext domain design
1. HttpContext.Current.Request, Response 2.HttpHandler-> ProcessRequest 3.HttpModule-> Init, I ...
- js常用方法 备用
/* function obj$(id) 根据id得到对象 function val$(id) 根据id得到对象的值 ...
- hdu 5952 Counting Cliques 求图中指定大小的团的个数 暴搜
题目链接 题意 给定一个\(n个点,m条边\)的无向图,找出其中大小为\(s\)的完全图个数\((n\leq 100,m\leq 1000,s\leq 10)\). 思路 暴搜. 搜索的时候判断要加进 ...
- Linux/Unix编程中的线程安全问题【转】
转自:http://blog.csdn.net/zhengzhoudaxue2/article/details/6432984 在目前的计算机科学中,线程是操作系统调度的最小单元,进程是资源分配的最小 ...
- 用Gen4消除电容触摸屏设计屏障【转】
转自:http://www.cntronics.com/sensor-art/80015498?page=2 中心议题: 电容式触摸屏设计到产品的各种挑战 解决方案: 用Gen4消除电容触摸屏设计屏障 ...
- Python学习杂记_8_从程序外部传参的办法sys.argv
Python用 sys.argv[] 实现从程序外部传参 “外部”的含义,其实就是这些参数不是你在程序中定义的,而是在程序之外通过输入操作传递进来的.sys.argv 会返回一个元组,元组的首个元素即 ...
- hdu 4520
小Q系列故事——最佳裁判 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- interview ms1 robert move **
move 2turn rightmove 3turn rightmove 6 初始位置为(0,0),方向为north,求最后的位置. string2char: const char* t = sec ...
- AC日记——N的倍数 51nod 1103
1103 N的倍数 思路: 先计算出前缀和: 然后都%n: 因为有n个数,所以如果没有sum[i]%n==0的化,一定有两个取模后的sum相等: 输出两个sum中间的数就好: 来,上代码: #incl ...
- AC日记——[SCOI2007]蜥蜴 bzoj 1066
1066 思路: 网络流最大流: 拆点,每个点拆成两个,流量为这个点的高度: 注意,文中说的距离是曼哈顿距离(劳资以为开根号wa了不知道多少次): 每两个距离不大于d的点连边,流量inf: 如果距离能 ...