-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgit.cpp
More file actions
73 lines (62 loc) · 2.01 KB
/
git.cpp
File metadata and controls
73 lines (62 loc) · 2.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/***
* git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,
* 比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,
* 即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。
* (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由
* 字符'0'或'1'组成,长度为n。matrix[i][j]=='1'当且仅当git树种第i个和第j个节点有连接。节点0为git树
* 的根节点。)
* **/
#include <bits/stdc++.h>
using namespace std;
bool dfs(vector<string>& matrix, vector<int>& pathR, int index, int x, int pre)
{
//将当前点压入
pathR.push_back(x);
if (x == index) //如果是寻找的index 说明联通 就退出
return true;
//如果从x到index可以连通 就压入index 退出
if (matrix[x][index] == '1')
{
pathR.push_back(index);
return true;
}
//每行遍历一遍
for (int i = 0; i < matrix.size(); i++)
{
if (i == pre) //剪枝
continue;
if (matrix[x][i] == '1')
{
vector<int> path = pathR;
if (dfs(matrix, path, index, i, x))
{
swap(path, pathR);
return true;
}
}
}
return false;
}
int getSplitNode(vector<string> matrix, int indexA, int indexB)
{
if (matrix.empty() ||
indexA >= matrix.size() ||
indexB >= matrix.size())
{
return -1;
}
vector<int> pathA;
vector<int> pathB;
dfs(matrix, pathA, indexA, 0, -1);
dfs(matrix, pathB, indexB, 0, -1);
int size = min(pathA.size(), pathB.size());
for (int i = 0; i < size; i++)
if (pathA[i] != pathB[i])
return pathA[i-1];
return pathA[size-1];
}
int main()
{
vector<string> vec = {"01011","10100","01000","10000","10000"};
cout << getSplitNode(vec, 1, 2);
}