Problem p02371 (C++)

Buggy submission (status: Runtime Error):
// 木の直径
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <stack>
#include <vector>

using namespace std;

#define MAX_N 100

const int WHITE = 0; // 未訪問
const int GRAY = 1;  // 訪問中
const int BLACK = 2; // 訪問完了

const int INV = -1;

typedef struct {
  int end;
  int weight;
} DATA;

// 木の情報を保持する動的配列
vector<DATA> G[MAX_N];

// 各頂点の訪問状態を保持する配列
int color[MAX_N + 1];

// 頂点:0から一番離れた頂点のNo.
int Zero_Leave_V = -1;
// 最大距離
int Max_Distance = -1;

int N;

void depthFirstSearch(int now_v, int distance);

int main(void) {
  int start;
  DATA ele;

  // 配列の初期化
  for (int i = 0; i < MAX_N + 1; i++) {
    color[i] = WHITE;
  }

  cin >> N;

  for (int i = 0; i < N - 1; i++) {
    cin >> start >> ele.end >> ele.weight;

    G[start].push_back(ele);
    // 双方向に設定する
    swap(start, ele.end);
    G[start].push_back(ele);
  }

  // 頂点:0を始点として, 深さ優先探索を実施して、一番遠い点を求める
  depthFirstSearch(0, 0);

  // 訪問情報の初期化
  for (int i = 0; i < MAX_N + 1; i++) {
    color[i] = WHITE;
  }

  Max_Distance = -1;

  // 頂点:0から最も離れた点から, 最も離れた点との距離を求める
  depthFirstSearch(Zero_Leave_V, 0);

  cout << Max_Distance << endl;

  return 0;
}

// 深さ優先探索を実施する関数
// now_vertex : 現在の頂点のNo.
// distance : 現在までの距離
void depthFirstSearch(int now_v, int distance) {

  int end, mid_distance;

  // 訪問中を設定
  color[now_v] = GRAY;

  for (unsigned int i = 0; i < G[now_v].size(); i++) {
    end = G[now_v][i].end;

    if (color[end] == WHITE) {
      // 距離の計算
      mid_distance = distance;
      mid_distance += G[now_v][i].weight;

      // 未訪問の頂点が存在する時は再帰的に関数コールする
      depthFirstSearch(end, mid_distance);
    }
  }

  // 訪問完了
  color[now_v] = BLACK;

  if (Max_Distance < distance) {
    Zero_Leave_V = now_v;
    Max_Distance = distance;
  }

  return;
}


Fixed submission:
// 木の直径
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <stack>
#include <vector>

using namespace std;

#define MAX_N 100000

const int WHITE = 0; // 未訪問
const int GRAY = 1;  // 訪問中
const int BLACK = 2; // 訪問完了

const int INV = -1;

typedef struct {
  int end;
  int weight;
} DATA;

// 木の情報を保持する動的配列
vector<DATA> G[MAX_N];

// 各頂点の訪問状態を保持する配列
int color[MAX_N + 1];

// 頂点:0から一番離れた頂点のNo.
int Zero_Leave_V = -1;
// 最大距離
int Max_Distance = -1;

int N;

void depthFirstSearch(int now_v, int distance);

int main(void) {
  int start;
  DATA ele;

  // 配列の初期化
  for (int i = 0; i < MAX_N + 1; i++) {
    color[i] = WHITE;
  }

  cin >> N;

  for (int i = 0; i < N - 1; i++) {
    cin >> start >> ele.end >> ele.weight;

    G[start].push_back(ele);
    // 双方向に設定する
    swap(start, ele.end);
    G[start].push_back(ele);
  }

  // 頂点:0を始点として, 深さ優先探索を実施して、一番遠い点を求める
  depthFirstSearch(0, 0);

  // 訪問情報の初期化
  for (int i = 0; i < MAX_N + 1; i++) {
    color[i] = WHITE;
  }

  Max_Distance = -1;

  // 頂点:0から最も離れた点から, 最も離れた点との距離を求める
  depthFirstSearch(Zero_Leave_V, 0);

  cout << Max_Distance << endl;

  return 0;
}

// 深さ優先探索を実施する関数
// now_vertex : 現在の頂点のNo.
// distance : 現在までの距離
void depthFirstSearch(int now_v, int distance) {

  int end, mid_distance;

  // 訪問中を設定
  color[now_v] = GRAY;

  for (unsigned int i = 0; i < G[now_v].size(); i++) {
    end = G[now_v][i].end;

    if (color[end] == WHITE) {
      // 距離の計算
      mid_distance = distance;
      mid_distance += G[now_v][i].weight;

      // 未訪問の頂点が存在する時は再帰的に関数コールする
      depthFirstSearch(end, mid_distance);
    }
  }

  // 訪問完了
  color[now_v] = BLACK;

  if (Max_Distance < distance) {
    Zero_Leave_V = now_v;
    Max_Distance = distance;
  }

  return;
}