// 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'而不是1if ((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;
}
轉載于:https://www.cnblogs.com/wdan2016/p/6416627.html
總結
以上是生活随笔為你收集整理的git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'--base--A--A' ^ | --- B--B' 小米工程师常常需要寻找两个分支最近的分割点,即b...的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。