Problem p03044 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <iostream>
#include <string>

using namespace std;

int main() {
  int n;
  long long u[110000], v[110000], w[110000];
  cin >> n;
  bool isw[110000][3];
  bool f = false;
  long count = 0;
  for (int i = 0; i < 10050; i++) // 初期化
  {
    isw[i][0] = false;
    isw[i][1] = false;
  }
  isw[1][0] = true;
  isw[1][1] = true; // 1の色を決めておく
  for (int i = 1; i < n; i++) {
    cin >> u[i] >> v[i] >> w[i];
  }
  while (!f) {
    for (int i = 1; i < n; i++) {
      if (isw[u[i]][1] == true) // u[i]の色が確定してるとき
      {
        isw[v[i]][0] = isw[u[i]][0]; // v[i]の色を決める
        // cout << v[i] << " paint " << isw[v[i]][0] << " because of " << u[i]
        // << endl;;
        if (w[i] % 2 == 1) // 距離が奇数のとき
        {
          isw[v[i]][0] = !isw[v[i]][0]; // 色を反転
        }
        // cout << isw[v[i]][1] << endl;
        if (isw[v[i]][1] == false) // 色を決めたとき
        {
          count++;
          // cout << "count++" << endl;
        }
        isw[v[i]][1] = true; // 確定フラグ
      }

      if (isw[v[i]][1] == true) // v[i]の色が確定してるとき
      {
        isw[u[i]][0] = isw[v[i]][0]; // u[i]の色を決める
        // cout << u[i] << " paint " << isw[u[i]][0] << " because of " << v[i]
        // << endl;;
        if (w[i] % 2 == 1) {
          isw[u[i]][0] = !isw[u[i]][0];
        }
        // cout << isw[v[i]][1] << endl;
        if (isw[u[i]][1] == false) {
          count++;
          // cout << "count++" << endl;
        }
        isw[u[i]][1] = true; // 確定フラグ
      }

      if (count == n - 1)
        f = true;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (isw[i][0] == 1)
      cout << 1 << endl;
    else
      cout << 0 << endl;
  }
}

Fixed submission:
#include <algorithm>
#include <iostream>
#include <string>

using namespace std;

int main() {
  int n;
  long long u[110000], v[110000], w[110000];
  cin >> n;
  bool isw[110000][3];
  bool f = false;
  long count = 0;
  for (int i = 0; i < 10050; i++) // 初期化
  {
    isw[i][0] = false;
    isw[i][1] = false;
  }
  isw[1][0] = true;
  isw[1][1] = true; // 1の色を決めておく
  for (int i = 1; i < n; i++) {
    cin >> u[i] >> v[i] >> w[i];
  }
  while (!f) {
    for (int i = 1; i < n; i++) {
      if (isw[u[i]][1] == true) // u[i]の色が確定してるとき
      {
        isw[v[i]][0] = isw[u[i]][0]; // v[i]の色を決める
        // cout << v[i] << " paint " << isw[v[i]][0] << " because of " << u[i]
        // << endl;;
        if (w[i] % 2 == 1) // 距離が奇数のとき
        {
          isw[v[i]][0] = !isw[v[i]][0]; // 色を反転
        }
        // cout << isw[v[i]][1] << endl;
        if (isw[v[i]][1] == false) // 色を決めたとき
        {
          count++;
          // cout << "count++" << endl;
        }
        isw[v[i]][1] = true; // 確定フラグ
      }

      if (isw[v[i]][1] == true) // v[i]の色が確定してるとき
      {
        isw[u[i]][0] = isw[v[i]][0]; // u[i]の色を決める
        // cout << u[i] << " paint " << isw[u[i]][0] << " because of " << v[i]
        // << endl;;
        if (w[i] % 2 == 1) {
          isw[u[i]][0] = !isw[u[i]][0];
        }
        // cout << isw[v[i]][1] << endl;
        if (isw[u[i]][1] == false) {
          count++;
          // cout << "count++" << endl;
        }
        isw[u[i]][1] = true; // 確定フラグ
      }

      if (count == n - 1)
        f = true;
    }
    for (int i = n; i > 1; i--) {
      if (isw[u[i]][1] == true) // u[i]の色が確定してるとき
      {
        isw[v[i]][0] = isw[u[i]][0]; // v[i]の色を決める
        // cout << v[i] << " paint " << isw[v[i]][0] << " because of " << u[i]
        // << endl;;
        if (w[i] % 2 == 1) // 距離が奇数のとき
        {
          isw[v[i]][0] = !isw[v[i]][0]; // 色を反転
        }
        // cout << isw[v[i]][1] << endl;
        if (isw[v[i]][1] == false) // 色を決めたとき
        {
          count++;
          // cout << "count++" << endl;
        }
        isw[v[i]][1] = true; // 確定フラグ
      }

      if (isw[v[i]][1] == true) // v[i]の色が確定してるとき
      {
        isw[u[i]][0] = isw[v[i]][0]; // u[i]の色を決める
        // cout << u[i] << " paint " << isw[u[i]][0] << " because of " << v[i]
        // << endl;;
        if (w[i] % 2 == 1) {
          isw[u[i]][0] = !isw[u[i]][0];
        }
        // cout << isw[v[i]][1] << endl;
        if (isw[u[i]][1] == false) {
          count++;
          // cout << "count++" << endl;
        }
        isw[u[i]][1] = true; // 確定フラグ
      }

      if (count == n - 1)
        f = true;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (isw[i][0] == 1)
      cout << 1 << endl;
    else
      cout << 0 << endl;
  }
}