// ConsoleApplication10.cpp : 定義控制臺應(yīng)用程序的入口點(diǎn)。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;class Solution {
public:/*** 返回git樹上兩點(diǎn)的最近分割點(diǎn)** @param matrix 接鄰矩陣,表示git樹,matrix[i][j] == '1' 當(dāng)且僅當(dāng)git樹中第i個和第j個節(jié)點(diǎn)有連接,節(jié)點(diǎn)0為git樹的跟節(jié)點(diǎn)* @param indexA 節(jié)點(diǎn)A的index* @param indexB 節(jié)點(diǎn)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;//如果同一深度,父節(jié)點(diǎn)相同,則分割點(diǎn)為父節(jié)點(diǎn)//同一深度,父節(jié)點(diǎn)不同,尋找父節(jié)點(diǎn)的父節(jié)點(diǎn)//不同深度,從深度高的往上過濾,每次過濾的時候判斷是否達(dá)到低的節(jié)點(diǎn)的深度;沒有之前,要判斷低的節(jié)點(diǎn)是否是深的節(jié)點(diǎn)的父節(jié)點(diǎn)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對應(yīng)的節(jié)點(diǎn)深int b = indexB;bool flag = false;//未找到分割點(diǎn)if (depth[indexA] < depth[indexB]){a = indexB;b = indexA;}while (depth[a]!=depth[b])//當(dāng)節(jié)點(diǎn)a和節(jié)點(diǎn)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;}//廣度優(yōu)先遍歷圖void breadTraverl(vector<string> matrix, vector<int> &depth, vector<int> &parent){//visited數(shù)組,如何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;//根節(jié)點(diǎn)的本身設(shè)置為自己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]應(yīng)該為'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<<"結(jié)果:"<<so.getSplitNode(matrix, 0, 2);cout << endl;return 0;
}
轉(zhuǎn)載于:https://www.cnblogs.com/wdan2016/p/6416627.html
總結(jié)
以上是生活随笔為你收集整理的git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'--base--A--A' ^ | --- B--B' 小米工程师常常需要寻找两个分支最近的分割点,即b...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。